更新:问题不在libcurl中。取消请求的正确方法是否从回调非零值返回。我使用了curl_progress_callback函数,一切正常。
答案 0 :(得分:0)
您需要了解的是CURL是一个C库。通常,您不能将指针传递给C ++对象或函数,因为C对C ++的类和调用约定一无所知。
例如,此行不正确:
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
CURL setopt CURLOPT_ERRORBUFFER
期望第三个参数是指向具有char
个字符空间的C样式字符串(C样式CURL_ERROR_SIZE
数组)的指针。而是将指针传递给std::string
对象。由于用C语言编写的CURL不知道std::string
是什么,它只是用错误数据覆盖具有sizeof (std::string)
字节的字节表示,因为它认为指针是C样式的{ {1}}数组。
请改用:
char
如果char errorBuffer[CURL_ERROR_SIZE + 1]; errorBuffer[CURL_ERROR_SIZE] = '\0';
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
返回错误代码,则 errorBuffer
仅填充有效字符串。
此外,curl_easy_perform()
是一个C ++函数。有了这条线:
Uploader::WriteResponce
CURL期望第三个参数是指针到C的函数。在这里,您将传递指向C ++的函数。您需要在调用C ++函数的curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteResponce);
函数中将调用包装到WriteResponce
:
extern "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
。