gpt4 book ai didi

c++ - Libcurl 错误将接收到的数据写入磁盘/应用程序失败

转载 作者:行者123 更新时间:2023-12-03 18:19:35 25 4
gpt4 key购买 nike

我正在编写一个类来使用 libcurl2 创建一个简单的 http get 请求。
我得到以下错误:

Libcurl error Failed writing received data to disk/application



我对 C++ 相当陌生,仍在学习,但我猜它与访问修饰符或范围有关

我希望有人能帮我解决这个问题。

类 HTTP 连接
#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 认为回调失败。

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

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

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

您的情况的解决方案应该很简单 - 将 write_callback 声明为静态(或免费)函数。在里面设置断点,看curl提供的所有参数都有效。您可能需要更改回调调用约定以匹配 curllib 预期的函数签名。

关于c++ - Libcurl 错误将接收到的数据写入磁盘/应用程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46005906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com