带有 libcurl C++的内存访问错误
Memory access error with libcurl C++
我正在尝试制作一个非常简单的程序,该程序获取用户请求(控制台)并将此请求发送到标头(libcurl)中的网站,然后获取响应标头。
所以我有 2 节课(实际上我有很多课,但对于这里的问题,我会简化)
我的主要.cpp获取请求并将其发送到我的服务。
所以这是我的服务 Fuzzer.h :
#ifndef FUZZER_H
#define FUZZER_H
#include <string>
using namespace std;
namespace furez
{
class Fuzzer {
private:
string url;
string response;
static size_t writeH_static(void *, size_t, size_t, void *);
public:
Fuzzer(string);
virtual ~Fuzzer();
string sendRequest(string);
size_t writeH(void *, size_t, size_t);
};
}
#endif
这是我的模糊器.cpp:
#include <string>
#include <curl/curl.h>
#include <iostream>
#include "Fuzzer.h"
namespace furez
{
Fuzzer::Fuzzer(std::string u)
{
this->url = u;
}
Fuzzer::~Fuzzer(){}
string Fuzzer::sendRequest(std::string request)
{
CURL *curl;
CURLcode res;
static const char *headerfilename = "head.out";
static const char *bodyfilename = "body.out";
curl = curl_easy_init();
if (curl) {
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Accept:");
chunk = curl_slist_append(chunk, "Another: yes");
chunk = curl_slist_append(chunk, "Host: example.com");
chunk = curl_slist_append(chunk, "X-silly-header;");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Fuzzer::writeH);
Fuzzer instance(request);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &instance);
curl_easy_setopt(curl, CURLOPT_URL, "localhost");
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %sn",
curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
curl_slist_free_all(chunk);
}
return request;
}
size_t Fuzzer::writeH_static(void *ptr, size_t size, size_t nmemb, void *stream)
{
return ((Fuzzer*)stream)->writeH(ptr, size, nmemb);
}
size_t Fuzzer::writeH(void *ptr, size_t size, size_t nmemb)
{
//std::string str = (CHAR *)ptr;
//std::string str2("Server:");
//if (str.find(str2) != string::npos) {
//this->response = str;
//}
size_t realsize = size * nmemb;
return realsize;
}
}
但是当我尝试执行此操作时,我遇到了内存错误。因为这个:
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Fuzzer::writeH);
我正在为我的项目使用 libcurl。我知道这是一个 C 库,也许是问题所在?
为了帮助我,我遵循了以下指示:libcurl 回调 w/c++ 类成员
而这个:curl WRITE函数和类我使用的是Windows 7,并获得了Visual Studio 2013。
(PS:当我把这段代码没有 &Fuzzer::writeH 和静态函数放在 main 中时.cpp它可以毫无问题地工作。
我认为问题就在这里:
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Fuzzer::writeH);
正如您正确指出的那样,libcurl 是一个 C 库,但您curl_easy_setopt指向成员函数的指针传递给函数。现在,函数指针和指向类成员的指针是不同的类型,因此,您不能这样做。我知道的唯一解决方案是使用蹦床呼叫。
- 创建一个纯函数(非类成员),您将在 curl_easy_setopt() 中将其注册为回调
- 使蹦床回调成为您班级的朋友(以便她可以在需要时访问私人成员)
- 传递给回调的用户数据参数应该是指向类的指针
- 在蹦床回调中,您将指针投射回您的类并调用所需的成员函数
举个例子:
extern "C" size_t trampolineCallback( char * i_buffer, size_t i_size, size_t i_nitems, void * i_userdata );
在你的类实现中,你将有类似的东西:
curl_easy_setopt( m_curlHndlPtr, CURLOPT_HEADERDATA, (void*) this );
curl_easy_setopt( m_curlHndlPtr, CURLOPT_HEADERFUNCTION, trampolineCallback );
您的蹦床实现将如下所示:
size_t trampolineCallback(char *i_buffer, size_t i_size, size_t i_nitems, void *i_userdata)
{
MyObj * object = (MyObj*) i_userdata;
object->myMemberFunc( i_buffer,i_size, i_nitems );
return (i_size * i_nitems);
}
相关文章:
- 为什么我的 setter 方法会产生错误的访问错误
- OpenCV C++ 3 维垫数据访问错误值
- C++ 将元素分配给映射值时访问错误
- 为什么代码会抛出非法内存访问错误
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- 从触摸回调访问向量元素的方法时,不良访问错误
- 筛子上的访问错误
- 查找() 上的 C++ 错误访问错误
- OPENCV MAT内存访问错误
- C - 空数对象的初始化发送不良访问错误
- std::函数 创建临时内存时内存访问错误
- 不良访问C 错误
- C 中的模棱两可的访问错误
- Win 32写入文件:访问错误1784
- 奇怪的结构访问错误
- 64位Windows API结构对齐导致命名管道上出现“拒绝访问”错误
- 不是NULL指针,而是错误的访问错误消息
- 统一读取和不可修复的访问错误
- 带有 libcurl C++的内存访问错误
- 非法内存访问错误