2011-09-13 67 views
0

更新:問題不在libcurl中。取消請求的正確方法是如果從回調非零值返回。我使用了curl_progress_callback函數,並且一切正常。libCurl。同時取消請求

+0

所示的代碼很好。問題在別處。顯示所有的代碼。 –

+0

@ n.m。但是當我編寫ProgressShow時總是返回0,一切正常無誤! – Alecs

+0

如果您擁有的是觸發器的圖片,則無法使用槍診斷問題。 –

回答

0

你需要了解的是CURL是一個C庫。一般來說,你不能傳遞指向C++對象或函數的指針,因爲C不知道關於C++類和調用約定的任何信息。

例如,這條線是不正確的:

curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); 

CURL SETOPT CURLOPT_ERRORBUFFER預計,第三個參數是一個指向具有用於CURL_ERROR_SIZE字符空間C風格串(C-風格char數組)。而是將指針傳遞給std::string對象。由於用C語言編寫的CURL不知道std::string是什麼,它只是用錯誤數據覆蓋具有sizeof (std::string)字節的字節表示,因爲它認爲指針是C風格的char數組。

使用這個代替:

char errorBuffer[CURL_ERROR_SIZE + 1]; errorBuffer[CURL_ERROR_SIZE] = '\0'; 
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); 

errorBuffer只充滿如果curl_easy_perform()返回錯誤代碼有效的字符串。

此外,Uploader::WriteResponce是一個C++函數。使用此行:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteResponce); 

CURL期望第三個參數是指向C函數。在這裏,你正在傳遞一個指向C++的函數。您需要調用換到WriteResponceextern "C"函數調用C++函數:

extern "C" size_t call_uploader_writeresponce(char *ptr, size_t size, size_t nmemb, void *user_data) { 
    return Uploader::WriteResponce(ptr, size, nmemb, static_cast<std::string *>(user_data)); 
} 


// ... 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &call_uploader_writeresponce); 

「寫功能」需要返回size_t,不int; Uploader::WriteResponce需要返回size_t

+0

但所有的工作正常。我只在ProgressShow返回非零值時才寫程序崩潰。我做了你所說的 - 同樣的事情 – Alecs

+0

@Alecs:它可能工作,但它絕對不會一直工作,因爲它調用未定義的行爲。請使用新代碼更新您的問題,該代碼包含我提到的問題的修補程序。 –

+0

我已經嘗試過沒有課,而且仍然是同樣的事情。問題已更新 – Alecs