libcurl斷點下載遇到的問題

最近遊戲把資源(圖片、配置、lua)的加載、更新全部改了 ,加載其實還好,就是不走之前的zip解壓方式。

以前的大體流程:

下載 –> 啓動 –> 解壓 –> 更新 –> 進入遊戲

現在的大體流程:

下載 –> 啓動 –> 更新 –> 進入遊戲

之前使用散文件gzip方式更新,現在換成下載zip包(斷點下載)

在改動完成之後準備提交appstore,結果崩潰的發現在某些設備上debug可以正常更新、release就始終有問題,一直失敗。後來在mac上安裝了http的抓包工具:HttpScope。發現在head請求之後就不再繼續走下去了,然後就猜測是否因爲release的原因,導致寫入文件時遇到權限問題了,然後就打log,重新生成release包測試…

最後定位到的問題是,head請求始終返回的是0,代碼是這樣寫的:

m_pUrlHandle = curl_easy_init();

double dSize = 0.0f;
curl_easy_setopt(m_pUrlHandle, CURLOPT_URL, m_strRemoteFileUrl.c_str());
curl_easy_setopt(m_pUrlHandle, CURLOPT_HEADER, 1); 
curl_easy_setopt(m_pUrlHandle, CURLOPT_NOBODY, 1);
if (curl_easy_perform(m_pUrlHandle) == CURLE_OK) {
    curl_easy_getinfo(m_pUrlHandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &dSize);
} else {
    dSize = 0.0f;
}

curl_easy_cleanup(m_pUrlHandle);
m_pUrlHandle = NULL;

改動就是去掉curl_easy_setopt(m_pUrlHandle, CURLOPT_HEADER, 1);

默認CURLOPT_NOPROGRESS爲開啓的

CURLOPT_NOSIGNAL我也設置過,沒用。CURLOPT_HEADER如果打開,它會將頭信息輸出在body中,會不會是因爲沒有設置CURLOPT_WRITEFUNCTION函數引起的問題呢?

仔細查curl的官方文檔http://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html,有這樣的發現:

也就是如果沒有設置CURLOPT_WRITEFUNCTION,那它會調用默認的fwrite方法,那它的路徑會是什麼呢?不清楚,上面也沒寫,所以就有可能導致寫入失敗,從而導致得到的size始終爲0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章