Libcurl為一個免費開源的,,客戶端url傳輸庫,,本文主要分析使用過程中遇到的卡死問題,。 問題描述LibCurl使用阻塞的方式來進行http下載,curl_easy_perform執(zhí)行后,,進程會在這里阻塞等待下載結(jié)束(成功OR失?。藭r若下載一段時間后出現(xiàn)網(wǎng)絡(luò)異常,,curl_easy_perform不會返回失敗,,整個線程阻塞卡死。 問題分析復(fù)現(xiàn):連接無線網(wǎng)絡(luò),,然后執(zhí)行curl_easy_perform下載,,下載過程中,斷開無線網(wǎng)絡(luò),,curl_easy_perform卡死,,阻塞整個線程。 原因:當(dāng)斷開無線網(wǎng)絡(luò)時,,使用命令行netstat ano | findstr ‘連接ip’, 可以發(fā)現(xiàn)LibCurl的http連接并沒有斷開(不知道是不是windows系統(tǒng)的bug),,如果將CURLOPT_TIMEOUT設(shè)置為無限等待,curl_easy_perform便會一直阻塞住線程,。 解決方案1,、如果我們不將CURLOPT_TIMEOUT設(shè)置為無限等待,是不會出現(xiàn)上面問題,,curl_easy_perform會在執(zhí)行一段時間(由CURLOPT_TIMEOUR設(shè)置),,結(jié)束并返回失敗,但是如果設(shè)置合適的CURLOPT_TIMEOUT是個問題,。
2,、使用multi模式下載, 而不使用easy模式, 此方法的唯一好處就是multi并不會阻塞, 而是立即返回. 但是缺點是帶來了問題, 其一就是需要自己去阻塞, 當(dāng)我們需要返回時再返回, 其二還需要啟動一個線程, 需要自己控制整個過程的節(jié)奏。 3,、在下載中, 另起一個線程, 若發(fā)現(xiàn)下載狀態(tài)卡死(可以通過定期檢查文檔大小來實現(xiàn)), 則從外部中斷下載線程. 此方法需另起線程, 而且直接中斷線程, 會給整個進程帶來不穩(wěn)定,。 4、設(shè)置CURLOPT_TIMEOUT為30s,,以30s為間隔斷點續(xù)傳。 5,、使用CURLOPT_LOW_SPEED_LIMIT, CURLOPT_LOW_SPEED_TIME
6,、使用CURLOPT_PROGRESSFUNCTION設(shè)置進度表回調(diào)函數(shù),可以在該回調(diào)函數(shù)內(nèi)部檢測下載是否出錯,,如果出現(xiàn)就中斷curl_easy_perform,,返回下載錯誤。
|
|
來自: 碼農(nóng)書館 > 《http》