如何使用libcurl实现HTTP流

时间:2019-05-18 23:50:47

标签: libcurl http-streaming

我正在尝试使用CURL来实现Microsoft的EWS流式传输通知,即HTTP流式传输,其中请求发送一次,服务器以“传输编码:分块”的标头作为响应。服务器将在最终数据包之前发送多个keepalive或通知块。这些块以cr lf终止。

如果我创建一个标准的CURL客户端,那么curl_easy_perform在接收到最后一个块之前不会返回,而我需要curl_easy_perform在接收到每个块后返回,然后应用程序将处理接收到的块并调用curl_easy_perform等待下一个块。

我意识到我可以处理CURLOPT_WRITEFUNCTION回调中的块,但是应用程序的体系结构不允许这样做(这是GSOAP插件)

除了切换到CURLOPT_CONNECT_ONLY并使用curl_easy_send和curl_easy_recv处理所有后续读取操作外,还有其他建议吗?似乎很遗憾,因为我将不得不复制CURL的格式和解析。

艾伦

1 个答案:

答案 0 :(得分:0)

curl_easy_perform是完全同步的,仅在完成整个传输后才返回。使用此API确实无法解决这个问题(您已经提到CURLOPT_CONNECT_ONLY,我也不推荐这样做)。

如果您要在整个传输完成之前将控制权返回到同一线程中,这是您的问题所建议的,那么您可能宁愿使用多接口。

使用该接口,curl_multi_perform仅会尽其所能,而不会阻塞并将控制权返回给您的函数。但是,它确实将责任转移到了代码上,以等待套接字活动并在有活动时再次调用libcurl。

(对不起,但是我不知道“ GSOAP插件”有什么限制,并且您没有在此处说明,所以也许这都是废话)