2010-11-12 47 views
4

我正在使用libcurl創建到服務器的http連接。在初始化期間,我指定了5秒的空閒超時值,並且還指定爲進度回調函數。我期待cURL在5秒鐘不活動後中止連接並停止調用進度回調,但是我發現大約15秒鐘後curl超時。爲什麼curl需要更多的時間來超時我比我指定的?將超時設置爲較大的值不會有幫助。如果我指定100秒,則在105秒不活動後超時。cURL:空閒超時間隔超過指定值

code = s_curl_easy_setopt(m_curl_handle, CURLOPT_NOPROGRESS, 0); 
assert(code == CURLE_OK); 
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback); 
assert(code == CURLE_OK); 

編輯:超時代碼

//this will set the timeout for quitting in case the network goes down 
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_LIMIT, 1); 
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_TIME, m_idle_timeout); 

回答

6

我已經想出了這一個。 cURL大約每秒更新其進度。要計算空閒超時,cURL會計算6次更新的平均字節數/秒,並將其與CURLOPT_LOW_SPEED_LIMIT進行比較。如果此值小於CURLOPT_LOW_SPEED_LIMIT一次超過CURLOPT_LOW_SPEED_TIME秒,則超時。因此,如果CURLOPT_LOW_SPEED_TIME爲5秒鐘,cURL將計算最近6次進度更新(約5秒)內的平均字節數/秒,然後檢查它是否小於CURLOPT_LOW_SPEED_LIMIT至少5秒,因此總時間約爲。 10秒。

0

(1)的libcurl上PROGRESSFUNCTION文檔說:

該函數獲得通過,而不是它的內部等效 的libcurl 與被叫在 操作期間(大約每秒一次或 更快),無論數據是否爲 轉移與否。

(2)你指的是「超時」?我能找到的唯一一個與連接有關的連接超時,這與在連接建立後終止連接無關,並且沒有發送數據 - 正如您似乎暗示的那樣。

+0

編輯問題添加超時代碼。 – 341008 2010-11-15 05:02:22