【问题标题】:libCurl. Cancel request while proceed库库尔。继续进行时取消请求
【发布时间】:2011-09-13 10:10:32
【问题描述】:

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

【问题讨论】:

  • 如图所示的代码很好。问题在别处。显示所有代码。
  • @n.m.但是当我写 ProgressShow 总是返回 0 时,一切正常,没有错误!
  • 如果你只有一张扳机的照片,就不可能诊断出枪的问题。
  • @n.m.我想我已经复制了所有代码。
  • 我无法重现崩溃。也许您应该在调试器下运行程序并分析回溯。此外,发布的程序缺少标题和main,并且存在编译错误(从void 函数返回的值);我必须修复所有这些来测试它。逐字发布崩溃的程序应该不难。

标签: c++ curl libcurl


【解决方案1】:

您需要了解的是,CURL 是一个 C 库。通常,您不能将指针传递给 C++ 对象或函数,因为 C 对 C++ 的类和调用约定一无所知。

例如,这行不正确:

curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);

CURL setopt CURLOPT_ERRORBUFFER 期望第三个参数是指向 C 样式字符串(C 样式 char 数组)的指针,该字符串有空间用于 CURL_ERROR_SIZE 字符。相反,您将指针传递给 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++ 函数的指针。您需要将对 WriteResponce 的调用包装在调用 C++ 函数的 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,而不是intUploader::WriteResponce需要返回size_t

【讨论】:

  • 但是一切正常。正如我在上面写的那样,只有当 ProgressShow 返回非零时程序才会崩溃。我照你说的做了——同样的事情
  • @Alecs:它可能有效,但肯定不会一直有效,因为它调用了未定义的行为。请使用新代码更新您的问题,该版本包含对我提到的问题的修复。
  • 我试过不上课,还是一样。问题已更新
  • @Alecs: char errorBuffer[CURL_ERROR_SIZE]; 必须是 char errorBuffer[CURL_ERROR_SIZE + 1]; 另外,在设置 CURLOPT_POSTFIELDSIZE_LARGE 选项时尝试将 body.length() 显式转换为 curl_off_tcurl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast&lt;curl_off_t&gt;(body.length()));
  • @Alecs:调试器在哪里说发生了段错误?
猜你喜欢
  • 2023-01-27
  • 2022-10-14
  • 2016-05-24
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2018-03-09
  • 2020-07-24
相关资源
最近更新 更多