2017-02-09 13 views
-1

使用libcurl處理小型應用程序。下載了源碼tar文件並編譯完成並一切正常。從C++使用libcurl的下載進度函數

跟在這個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

+2

出示您的[MCVE]請不要標記語言無關。 –

+0

@LightnessRacesinOrbit'libcurl'是一個'c'庫,並在'C++'應用程序中使用它。請問哪個標籤是錯的?謝謝。 – ramtheconqueror

+1

'FileTransfer :: progressCallback'是一個非靜態成員函數,對嗎?嘗試包裝它並將指針傳遞給普通的舊函數。 – Phillip

回答

3

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