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

时间:2017-02-09 17:59:27

标签: c++ c libcurl

使用androidSdk处理小型应用程序。下载源tar文件并编译好,直到这里。

遵循此progress function示例,该示例无效。

设置回调函数以显示进度

libcurl

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;
}

并且错了。我没有上传任何内容(4233172来自哪里),........ 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 ......... 显示dlTotal值(即下载的字节数),dlNow始终为0。

此外,dlNow无效。根据文档,这可能是任何东西,我尝试传递CURLOPT_XFERINFODATA,一些随机结构和一个int,似乎没有任何东西传递给回调函数(this始终为null)

使用最新的void* clientp版本7.52.1

1 个答案:

答案 0 :(得分:3)

libcurl是一个C库,因此它对C ++成员函数一无所知。如果你只是把一个C ++方法作为回调,那么代码就会认为这是一个隐藏的'这个'指针作为第一个参数传递,而libcurl是一个C库,它没有发送一个'这个'然后你的论点都搞错了。

你可以克服这个"限制"使用静态相对容易 传递指向类的指针的成员函数:

 // 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);