libcurl错误失败的写作已接收到磁盘/应用程序的数据
Libcurl error Failed writing received data to disk/application
我正在编写一个类,以创建一个使用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;
}
更多信息在这里和这里。
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- libcurl错误失败的写作已接收到磁盘/应用程序的数据
- 当应用程序需要更多 RAM 时,如何允许将一段内存换出到磁盘
- 以RAW形式恢复磁盘内容并转储为一个大二进制文件的应用程序
- WinApi.应用程序提供了错误的磁盘信息
- 有人知道上下文切换吗?通过FSYNC和syslog ng从应用程序到磁盘的日志记录
- 在Linux c++应用程序中获取SCSI磁盘名称的方法
- 显示磁盘/应用程序生成的图片