簡體   English   中英

curl_easy_perform()-不要等待響應

[英]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后立即“斷開”連接/操作。

筆記

我知道我可能會考慮不同的方法,例如:

  1. 使用異步curl API
  2. 在不同的線程中使用curl
  3. 查看服務器/客戶端代碼以找出為什么花這么長時間

但是,該問題仍然有效。

您可能可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM