curl_easy_perform() - 不要等待回复

时间:2017-07-23 10:10:42

标签: c++ windows http curl

背景

我有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; 

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

我想在upload completely sent off部分后立即“中断”连接/操作。

注释

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

  1. 使用async curl API
  2. 在不同的帖子中使用curl
  3. 查看服务器/客户端代码,了解为什么需要这么长时间
  4. 然而,这个问题仍然有效。

1 个答案:

答案 0 :(得分:1)

您可以使用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的其余部分可以在专用线程中使用,这可能更快你,因为你甚至不必等待上传完成,只需启动专用线程卷曲