libcurl错误失败的写作已接收到磁盘/应用程序的数据

Libcurl error Failed writing received data to disk/application

本文关键字:磁盘 应用程序 数据 失败 错误 libcurl      更新时间:2023-10-16

我正在编写一个类,以创建一个使用libcurl2的简单http获取请求。我回到以下错误:

libcurl错误失败的写作已接收到磁盘/应用程序

我是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 

您从呼叫Curllib API收到的错误表明在保存接收到的数据时发生了问题。

由于您已经设置了回调卷曲,认为回调失败了。

curl会假设回调未能处理接收到的数据是返回的值与接收到的字节数不同。

在您的情况下,这意味着您已经使用return 0;进入分支机构 - 您应该能够通过在回调中设置断点来调试它。

在回调的最后一个参数中接收到nullptr的原因 - 您已将其声明为类的非静态成员,这意味着它已隐藏了第一个参数。>

在您的情况下,解决方案应该很容易 - 将write_callback声明为静态(或免费)功能。设置其中的断点,并查看卷曲提供的所有参数都是有效的。您可能需要更改回调呼叫约定,以匹配Curllib期望的功能签名。

回调功能需要返回 size_t 对象:

static size_t write_data(char *ptr, size_t size, size_t nmemb, void *user){
    // If you're expecting JSON as response: parse pointer
    nlohmann::json res = nlohmann::json::parse(ptr);
    // print JSON
    std::cout << res.dump();
    return size * nmemb;
}

更多信息在这里和这里。