2017-09-01 71 views
0

libcurl2を使用して簡単なhttp getリクエストを作成するクラスを作成しています。私は、C++にかなり新しいですまだ学んが、私はそれがアクセス修飾子または私は誰かがすることを願ってスコープLibcurlエラー受信したデータをディスク/アプリケーションに書き込めませんでした。

とは何かを持って推測している

Libcurl error Failed writing received data to disk/application

: は、私は戻って次のエラーを取得しますこれで私を助けてください。

クラスのHttpConnection

#include "HTTPconnection.h" 
#include <iostream> 
#include <string> 

using namespace httptest; 

HTTPconnection::HTTPconnection() 
{ 
    curl_global_init(CURL_GLOBAL_DEFAULT); 
    curl = curl_easy_init(); 
} 

size_t HTTPconnection::write_callback(char * data, size_t 
size, size_t nmemb, std::string * writerData) 
{ 
    if (writerData == NULL) 
     return 0; 

    writerData->append(data, size*nmemb); 
    return size * nmemb; 
} 

std::string HTTPconnection::createConnection(const char *url, const char *proxy) 
{ 
    curl_easy_setopt(HTTPconnection::curl, CURLOPT_URL, url); 

    curl_easy_setopt(HTTPconnection::curl, CURLOPT_WRITEFUNCTION, &HTTPconnection::write_callback); 
    curl_easy_setopt(HTTPconnection::curl, CURLOPT_WRITEDATA, &HTTPconnection::buffer); 

    res = curl_easy_perform(HTTPconnection::curl); 
    std::cout << curl_easy_strerror(res); 

    return buffer; 
} 


HTTPconnection::~HTTPconnection() 
{ 
    curl_easy_cleanup(curl); 
    curl_global_cleanup(); 
} 

HTTPconnection.h

#ifndef HTTPconnection_H 
#define HTTPconnection_H 

#include <string> 
#include "libcurl/include/curl/curl.h" 

#ifdef _DEBUG 
#pragma comment(lib, "libcurl/lib/libcurl_a_debug.lib") 
#else 
#pragma comment(lib, "libcurl/lib/libcurl_a.lib") 
#endif 


namespace httptest 
{ 
    class HTTPconnection 
    { 
    public: 
     //Default Constructor 
     HTTPconnection(); 
     std::string createConnection(const char *url, const char *proxy); 

     //Destructor 
     ~HTTPconnection(); 

    private: 

     //methods 
     size_t write_callback(char *data, size_t size, size_t nmemb, std::string *writerData); 

     //members 
     std::string buffer; 
     CURL *curl; 
     CURLcode res; 

    }; 
} 

#endif // !HTTPconnection_H 

答えて

1

あなたがAPIをcurllibの呼び出しから取得するエラーは、その問題は、受信したデータを保存中に発生したことを示します。

コールバックを設定しているので、curlはコールバックが失敗したと考えます。

Curlは、受信したデータを処理できなかったコールバックは、返された値が受信したバイト数と異なると想定します。

あなたの場合はreturn 0;というブランチを入力したことを意味します。コールバックにブレークポイントを設定することでデバッグできるはずです。

nullptrがコールバックの最後のパラメータで受け取られた理由 - クラスの非静的メンバとして宣言しました。つまり、このコールバックを呼び出すCコードが認識していない最初のパラメータが隠されています。

解決策は簡単です。静的(またはフリー)関数としてwrite_callbackを宣言してください。その中にブレークポイントを設定し、curlによって提供されるすべてのパラメータが有効であることを確認してください。 curllibが期待する関数シグネチャと一致するように、コールバック呼び出し規約を変更する必要があります。

関連する問題