c++ - 从 C++ 使用 libcurl 的下载进度函数

标签 c++ c libcurl

正在使用 libcurl 开发一个小型应用程序。下载源 tar 文件并编译,一切正常。

关注此 progress function无法正常工作的示例。

设置显示进度的回调函数

curl_easy_setopt(m_curl, CURLOPT_XFERINFOFUNCTION, &FileTransfer::progressCallback);
curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 0);

这是

int FileTransfer::progressCallback(void* clientp, curl_off_t dlTotal, curl_off_t dlNow, curl_off_t ulTotal, curl_off_t ulNow)
{
    fprintf(stderr, "UP: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
              "  DOWN: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T
              "\r\n",
              ulNow, ulTotal, dlNow, dlTotal);
    return 0;
}

正在打印

........
UP: 4233172 of 0  DOWN: 0 of 2588672
UP: 4233172 of 0  DOWN: 0 of 2588672
UP: 4233172 of 0  DOWN: 0 of 2588672
UP: 4233172 of 0  DOWN: 0 of 2588672
.........

而且是错误的。我没有上传任何东西(4233172 来自哪里)并且 dlTotal 正在显示 dlNow 值(即下载的字节数)并且 dlNow 总是0.

另外,CURLOPT_XFERINFODATA 不工作。根据文档,这可以是任何东西,我尝试传递 this、一些随机结构和一个 int,但似乎没有任何东西传递给回调函数(void* clientp始终为空)

使用最新的 libcurl 版本 7.52.1

最佳答案

libcurl 是一个 C 库,因此它对 C++ 成员函数一无所知。如果你只是把一个 C++ 方法作为回调,代码会认为有一个隐藏的“this”指针作为第一个参数传递,而 libcurl 是一个 C 库,它不会发送一个“this”,然后你的参数就全错了.

您可以使用静态相对轻松地克服此“限制” 传递给类的指针的成员函数:

 // f is the pointer to your object.
 static size_t YourClass::func(void *buffer, size_t sz, size_t n, void *f)
 {
   // Call non-static member function.
   static_cast<YourClass*>(f)->nonStaticFunction();
 }

 // This is how you pass pointer to the static function:
 curl_easy_setopt(hcurl, CURLOPT_XFERINFOFUNCTION, YourClass::func);
 curl_easy_setopt(hcurl, CURLOPT_XEFRINFODATA, this);

关于c++ - 从 C++ 使用 libcurl 的下载进度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42143742/

相关文章:

c - While 循环在条件出现之前停止

c - 打印 EOF 值的预期程序

openssl - 无法为 iOS 使用 ssl 构建 curl

c++ - 禁用单元测试 MSTest

c++ - 具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程?

c++ - 如何以线程安全的方式从多个文本文件中删除某些字符?

c - libcurl curl/curl.h 没有这样的文件或目录 Win xp 32 MinGW

c++ - 通过命令行控制 shell 程序,给它多个指令/数据

c - 函数执行后数组变为 NULL

python - Windows 上的 pycurl 安装