2017-09-01 1298 views
0

我正在编写一个类,使用libcurl2创建一个简单的http get请求。 我得到以下错误:Libcurl错误将接收到的数据写入磁盘/应用程序失败

Libcurl error Failed writing received data to disk/application

我是相当新的C++,还是学习,但我猜它是与访问修饰符或范围

我希望有人能帮助我,与此。

类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

你从电话到curllib API的错误表明问题保存接收到的数据中出现。

由于您设置了回调curl认为回调失败。

Curl将假定回调失败处理收到的数据是返回的值不同于接收到的字节数。

就你而言,这意味着你已经通过return 0;进入了分支 - 你应该能够通过在你的回调中设置断点来调试它。

在回调的最后一个参数中接收到nullptr的原因 - 您已将它声明为该类的非静态成员,这意味着它隐藏了第一个参数,即调用此回调的C代码不知道的第一个参数。

您的案例中的解决方案应该很容易 - 将write_callback声明为静态(或免费)函数。在其中设置断点并查看由curl提供的所有参数都是有效的。您可能需要更改回调调用约定以匹配curllib预期的函数签名。

相关问题