curl_easy_perform() - 不要等待响应

curl_easy_perform() - do NOT wait for response

本文关键字:响应 等待 easy perform curl      更新时间:2023-10-16

>Background

VS2015 C++有一个项目,在所有Windows>=XP中运行,它使用 libcurl 来处理客户端请求。

问题

从经验上讲,服务器响应时间太长,我的进程被阻止了。

我想知道 curl 是否提供了一些方法来跳过 curl_easy_perform(( API 中的服务器响应部分。

尝试

使用 CURLOPT_TIMEOUT 不是有效的选项。

我曾经CURLOPT_DEBUGFUNCTION并注意到以下日志:

[TimeElapsed: 0 ms]:   Trying ...;  
[TimeElapsed: 1 ms]: TCP_NODELAY set;   
[TimeElapsed: 5 ms]: Connected to  () port  (#0);   
[TimeElapsed: 5 ms]: => Send header 
[TimeElapsed: 5 ms]: => Send data   
[TimeElapsed: 6 ms]: upload completely sent off: 493 out of 493 bytes;  
[TimeElapsed: 98 ms]: <= Recv header    
[TimeElapsed: 98 ms]: <= Recv header    
[TimeElapsed: 1753 ms]: <= Recv header  
[TimeElapsed: 1765 ms]: <= Recv header  
[TimeElapsed: 1828 ms]: <= Recv header  
[TimeElapsed: 1887 ms]: <= Recv header  
[TimeElapsed: 1932 ms]: <= Recv data    
[TimeElapsed: 1967 ms]: Connection #0 to host  left intact; 

您可以看到我的客户端工具需要 6 毫秒才能发送其数据。但是,服务器需要 2 秒才能响应,这太浪费了。

我想在upload completely sent off部分之后立即"断开"连接/操作。

笔记

我知道我可能会考虑不同的方法(我就是这样(,例如:

  1. 使用异步卷曲 API
  2. 在不同的线程中使用卷曲
  3. 查看服务器/客户端代码以找出为什么需要这么长时间

但是,这个问题仍然有效。

您可以使用CURLOPT_XFERINFOFUNCTION来确定上传何时完全发送,然后停止卷曲,例如

curl_easy_setopt(ch, CURLOPT_XFERINFOFUNCTION, [](void * , curl_off_t, curl_off_t, curl_off_t ultotal, curl_off_t ulnow) - > int {
if (ulnow >= ultotal) { /*stop curl, upload is complete*/
return 1;
} else { /*upload not complete yet.*/
return 0;
}
});

(未经测试(

编辑:警告,为了完全调用CURLOPT_XFERINFOFUNCTION,CURLOPT_NOPROGRESS必须首先设置为 0,因此也要curl_easy_setopt(ch, CURLOPT_NOPROGRESS,0);

另外,你知道 curl 是线程安全的吗? 只要您正确使用curl_global_init(例如,在任何其他线程开始使用 curl 函数之前在主线程中运行一次(,其余curl_easy可以在专用线程中使用,这对您来说可能更快,因为您甚至不必等待上传完成, 只需为 curl 启动一个专用线程