2016-09-16 29 views
1

我在程序中使用了一些自動更新功能。如果連接失敗,我希望程序繼續嘗試長達15秒,然後宣佈失敗。爲了實現這一目標,我用下面的curl_easy_setopt的捲曲容易的選擇:僅在連接失敗時才使libcURL超時

curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15); 

但後來我發現,如果下載的時間超過15秒,超時錯誤公佈。

我該如何限制15秒才能發生故障?也就是說,如果15秒沒有連接,


更多信息

我使用的完整選項列表如下:

CURLcode res = curl_easy_perform(curl); 

如果:

curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); 
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //verify ssl peer 
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); //verify ssl hostname 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); 
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); 
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, this); //pointer to the current class as it's a GUI program 
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CurlProgress_CallbackFunc_UpdateProgress); 
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20); 

,並調用開始通過做你需要更多的信息,請我知道。

謝謝。

+0

@Eichhörnchen試過了......它沒有這樣做......這顯然只是爲了最初的連接。要清楚,我身體斷開我的互聯網連接,看看是否有影響。 –

+0

@EichhörnchenThis Works!謝謝! –

回答

2

代替

curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20); 

使用

curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); 
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1); 
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 15); 

的第一行是在連接階段的超時時間。建立連接後,超時變得無關緊要,但接下來的兩行確保如果15秒時間範圍內的平均速度低於每秒1字節,則操作將中止。

另外值得注意的是,如果curl被丟棄,curl不會嘗試重新建立任何連接,因爲如果物理連接(暫時)丟失,直到其中一方決定超時,TCP連接仍然可以被保留。

相關問題