从 C++ 使用 libcurl 的下载进度函数
Using libcurl's download progress function from C++
正在使用 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
始终为 null)
使用最新的libcurl
版本7.52.1
libcurl 是一个 C 库,所以它对 C++ 成员函数一无所知。如果你只是把一个 C++ 方法作为回调,代码会认为有一个隐藏的 'this' 指针作为第一个参数传递,而 libcurl 是一个 C 库,它不会发送 'this' 然后你的参数全错了。
您可以使用静态方法相对轻松地克服这个问题 "limitation"
传递指向 class:
的指针的成员函数
// 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);
正在使用 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
始终为 null)
使用最新的libcurl
版本7.52.1
libcurl 是一个 C 库,所以它对 C++ 成员函数一无所知。如果你只是把一个 C++ 方法作为回调,代码会认为有一个隐藏的 'this' 指针作为第一个参数传递,而 libcurl 是一个 C 库,它不会发送 'this' 然后你的参数全错了。
您可以使用静态方法相对轻松地克服这个问题 "limitation" 传递指向 class:
的指针的成员函数 // 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);