我使用libcurl easy interface并在我的c ++应用程序中创建了许多线程来处理这些http请求。我想将代码转换为使用libcurl multi代替。从概念上讲,这个想法是明确的:不是在多个线程的每个curl easy句柄上调用阻塞curl_easy_perform,而是从单个线程调用阻塞curl_multi_perform,这个内部调用将处理所有连接的curl容易处理。
对我来说不清楚的事情:
如何取消阻止curl_multi_perform调用(来自另一个线程)处理的任何未完成的http请求。类似地,同样的工作与简单的接口,我可以结束/关于来自另一个线程的http请求,而另一个线程在该句柄上执行curl_easy_perform。
在多句柄上有另一个线程调用curl_multi_perform时,可以向多个句柄添加新的简单句柄吗?
如果我在加载数据时使用curl_multi_remove_handle中止其中一个传出的http请求(让我们说它正在进行1GB文件下载)那么我可以在之后重复使用相同的句柄。 curl是否关闭在中间中止的tcp连接?否则,我不知道在没有完全下载整个1GB机身的情况下如何重复使用这种连接。
是否有一个简单的例子用于从不同的线程执行多个简单请求,同一个示例转换为多个接口?
答案 0 :(得分:2)
(这实际上是伪装成一个问题的几个问题,这不适合stackoverflow。)
curl_multi_perform()
没有阻止。它现在尽可能多地做,然后它返回并期望程序在其时间或其中一个套接字上的活动时再次调用它。
理想情况下,您可以在其他线程中标记要停止的转移,并且只要curl_multi_perform()
返回,您就可以从多个句柄中移除所述简单句柄,并且它们不再在游戏中。或者,您可以使用单个传输的回调(写入/读取/进度)在您希望传输结束时返回错误。
不确定在任何给定时刻在多个线程中使用相同的libcurl句柄。如果你真的需要从多个线程使用相同的句柄,那么你需要仔细静音。请参阅libcurl treading man page。通常最好从其他线程将内容放入qeueus,并让单个libcurl-using线程在可能的情况下从该队列中读取句柄或操作,从而确保单个线程访问句柄。
如果您通过使用curl_multi_remove_handle()
删除句柄来中止转移,则会中止该转移。停止。您可以立即重新使用该句柄,如果您只是将其重新放入,它将被视为全新的转移,除非您在简单的句柄中更改任何选项,否则它将从头开始使用相同的URL。当然可以正确处理过早中止的传输,这可能包括在必要时关闭TCP连接。