libcurl使用時(shí)疑難問(wèn)題: 在使用libcurl時(shí), jwisp發(fā)現(xiàn), curl_easy_perform是阻塞的方式進(jìn)行下載的, curl_easy_perform執(zhí)行后,程序會(huì)在這里阻塞等待下載結(jié)束(成功結(jié)束或者失敗結(jié)束).此時(shí)若正常下載一段時(shí)間后,進(jìn)行網(wǎng)絡(luò)中斷, curl_easy_perform并不會(huì)返回失敗,而是阻塞整個(gè)程序卡在這里,此時(shí)即使網(wǎng)絡(luò)連接重新恢復(fù), curl_easy_perform也無(wú)法恢復(fù)繼續(xù)下載,導(dǎo)致整個(gè)程序出現(xiàn)”死機(jī)”狀態(tài). 但是若先斷網(wǎng), 然后進(jìn)行curl_easy_perform的話,會(huì)直接返回失敗,不會(huì)阻塞 在網(wǎng)上搜索后發(fā)現(xiàn), 大家在網(wǎng)上遇到這個(gè)問(wèn)題的很多,但是解決方法很少,下面jwisp就把網(wǎng)上建議的可以使用的解決方法羅列: 1. 使用multi模式下載,而不使用easy模式,此方法的唯一好處就是multi并不會(huì)阻塞,而是立即返回.但是缺點(diǎn)是帶來(lái)了問(wèn)題,其一就是需要自己去阻塞,當(dāng)我們需要返回時(shí)再返回,其二還需要啟動(dòng)一個(gè)線程,需要自己控制整個(gè)過(guò)程的節(jié)奏. 2. 在下載中,另起一個(gè)線程,若發(fā)現(xiàn)下載狀態(tài)卡死(可以通過(guò)定期檢查文件大小來(lái)實(shí)現(xiàn)),則從外部中斷下載線程.此方法需另起線程,而且直接中斷線程,會(huì)給整個(gè)程序帶來(lái)不穩(wěn)定. 主要的設(shè)計(jì)思路如下, 下載過(guò)程中,設(shè)置超時(shí)時(shí)間為30秒, 30秒后若下載未完成就重新連接進(jìn)行下載(這個(gè)可解決卡死問(wèn)題),。 超時(shí)代碼設(shè)計(jì)如下: curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L ); //在屏幕打印請(qǐng)求連接過(guò)程和返回http數(shù)據(jù) curl_easy_setopt( curl, CURLOPT_TIMEOUT, 10 );//接收數(shù)據(jù)時(shí)超時(shí)設(shè)置,,如果10秒內(nèi)數(shù)據(jù)未接收完,,直接退出 curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1); // 以下3個(gè)為重定向設(shè)置 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //返回的頭部中有Location(一般直接請(qǐng)求的url沒(méi)找到),,則繼續(xù)請(qǐng)求Location對(duì)應(yīng)的數(shù)據(jù) curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1);//查找次數(shù),防止查找太深 curl_easy_setopt( curl, CURLOPT_CONNECTTIMEOUT, 3 );//連接超時(shí),,這個(gè)數(shù)值如果設(shè)置太短可能導(dǎo)致數(shù)據(jù)請(qǐng)求不到就斷開(kāi)了 |
|