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

Using libcurl's download progress function from C++

本文关键字:函数 下载 C++ 使用 libcurl      更新时间:2023-10-16

使用 libcurl 开发小型应用程序。下载了源tar文件并编译,直到这里都很好。

遵循此进度函数示例,该示例无法按预期工作。

设置用于显示进度的回调函数

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
              "rn",
              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,一些随机结构和一个整数,似乎没有任何东西传递给回调函数(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);