首页 > 解决方案 > 使用 libcurl 多接口连续请求相同的“简单”句柄

问题描述

我的开发组织有自己的线程和 select() 包装器实现。应用程序需要增强以执行 HTTPS 请求,我决定使用 libcurl。经过一番研究,我发现 curl_easy_perform 是一个阻塞调用,所以我决定将 curl_multi_perform 方法用于非阻塞调用,以允许线程中的其他工作。

HTTPS 请求需要定期对同一 URL 执行。我知道我可以保留相同的 curl_easy 句柄并将其提供给 curl_multi 句柄。我会执行 curl_multi_perform 来获得结果,但我稍后需要使用 curl_multi_perform 重新发送请求,比如在 5 分钟内。因此,这将是使用相同的简单句柄的连续请求。但是,我不确定 curl_easy 接口如何告诉多接口在我收到第一个请求的结果后何时重新发送请求。我该如何做到这一点?

(也许从多句柄中删除简单句柄,并在再次需要请求时将其重新添加到多句柄?)

我认为无论使用什么技术,传出请求都将使用相同的传出端口。

标签: c++multithreadinglibcurl

解决方案


(也许从多句柄中删除简单句柄,并在再次需要请求时将其重新添加到多句柄?)

正确的。从 libcurl文档

单次传输完成后,简单句柄仍会添加到多堆栈中。您需要先使用 curl_multi_remove_handle 删除简单句柄,然后使用 curl_easy_cleanup 将其关闭,或者可能为其设置新选项并使用 curl_multi_add_handle 再次添加以开始另一次传输。

.

我认为无论使用什么技术,传出请求都将使用相同的传出端口

这不能保证。libcurl 将尝试重新使用与简单句柄关联的现有连接,但如果先前的连接已经断开,则将建立一个具有不可预测本地端口的新连接。


推荐阅读