curl_easy_perform() - 不要等待响应
curl_easy_perform() - do NOT wait for response
>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
部分之后立即"断开"连接/操作。
笔记
我知道我可能会考虑不同的方法(我就是这样(,例如:
- 使用异步卷曲 API
- 在不同的线程中使用卷曲
- 查看服务器/客户端代码以找出为什么需要这么长时间
但是,这个问题仍然有效。
您可以使用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 启动一个专用线程
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- HTTP帖子,无需等待响应
- curl_easy_perform() - 不要等待响应
- QT如何显示,请等待对话框,而插座正在等待响应
- 确定QProcess是否已完成执行或正在等待用户输入(或响应)
- 在 UWP 应用程序中,future.wait() 在尝试同步来自异步方法的响应时继续等待
- 等待ping命令响应时出现Q消息
- 打开另一个表单,然后等待该表单返回响应
- Qt websocket发送消息并等待响应,然后再进入下一个方法
- visualstudio2010-如何制作一个正在等待某个事件的c++程序,使其看起来响应迅速
- visualstudio2010-将字符串从一个C++程序发送到另一个程序并等待响应
- MPI忙,等待响应
- 如何在PNaCl中等待WebSocket响应