[英]curl_easy_perform() - do NOT wait for response
我有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
后立即“斷開”連接/操作。
我知道我可能會考慮不同的方法,例如:
但是,該問題仍然有效。
您可能可以使用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都可以在專用線程中使用,對於您來說,這可能甚至更快甚至不必等待上傳完成,只需啟動專用線程即可卷曲
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.