簡體   English   中英

從C ++使用libcurl的下載進度功能

[英]Using libcurl's download progress function from C++

使用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
              "\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”,然后您的參數將全部出錯。

您可以使用傳遞給該類的指針的靜態成員函數相對輕松地克服此“限制”:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM