我有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
部分后立即“中断”连接/操作。
我知道我可能会考虑不同的方法(我是),例如:
然而,这个问题仍然有效。
答案 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的其余部分可以在专用线程中使用,这可能更快你,因为你甚至不必等待上传完成,只需启动专用线程卷曲