libcurl的。继续时取消请求

时间:2011-09-13 10:10:32

标签: c++ curl libcurl

更新:问题不在libcurl中。取消请求的正确方法是否从回调非零值返回。我使用了curl_progress_callback函数,一切正常。

1 个答案:

答案 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