2017-02-09 6 views
-1

libcurlを使用して小さなアプリケーションで作業しています。ソースtarファイルをダウンロードし、コンパイルして、ここまで細かくコンパイルしました。C++のlibcurlのダウンロードの進行機能を使用

これに続くprogress functionこれは想定されていない例です。

........ 
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 
......... 

を印刷し、間違っているれる

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

で進行

curl_easy_setopt(m_curl, CURLOPT_XFERINFOFUNCTION, &FileTransfer::progressCallback); 
curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 0); 

を示すためのコールバック関数を設定します。私はdlNow値(すなわち、バイトをダウンロード)とdlNowを示しているもの(ここで、4233172から来ている)とdlTotalをアップロードしていないよ。また、CURLOPT_XFERINFODATAが機能していません常に0

されます。ドキュメントごとのように、これは何もすることができ、私はthisを渡してみました、いくつかのランダムな構造体、およびint型と何がコールバック関数に渡されるようだ(void* clientpは常にnullである)

最新libcurlバージョン7.52.1を使用して

+2

があなたの[MCVE]してください現在、そして無関係な言語をタグ付けしていない:

あなたは、クラスへのポインタを渡される静的 メンバ関数を使用して比較的容易にこの「限界」を克服することができます。 –

+0

@LightnessRacesinOrbit 'libcurl'は' c'ライブラリであり、 'C++'アプリでそれを使用しています。間違ったタグはどちらですか?ありがとう。 – ramtheconqueror

+1

'FileTransfer :: progressCallback'は非静的メンバー関数です、そうですか?それをラップして、ポインタを普通の古い関数に渡してみてください。 – Phillip

答えて

3

libcurlはCライブラリであるため、C++のメンバー関数については何も知られていません。そして、あなたがコールバックとしてC++メソッドを置くだけでは、コードは最初の引数として渡された隠れた 'this'ポインタがあると思うのに対し、libcurlは 'this'を送らない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); 
関連する問題