gpt4 book ai didi

c++ - curl_easy_perform() - 不要等待响应

转载 作者:行者123 更新时间:2023-11-28 05:04:02 27 4
gpt4 key购买 nike

背景

我有 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 秒才能响应,这太浪费了。

我想在 上传完全发送 部分后立即“中断”连接/操作。

注意事项

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

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

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

最佳答案

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

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++ - curl_easy_perform() - 不要等待响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45263892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com