我正在尝试编写一个类,以便使用cURL从C++网站中获取一些数据。这是该类的示例(有一个Curl * curl_数据成员,rawData_是一个字符串)。此摘录来自实现文件,所有函数都在 header 中声明。
MyClass::MyClass()
{
curl_global_init(CURL_GLOBAL_ALL);
curl_ = curl_easy_init();
curl_easy_setopt(curl_, CURLOPT_URL,
"http://www.google.com");
curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, &MyClass::writeCallback);
}
MyClass::~MyClass()
{
curl_easy_cleanup(curl_);
curl_global_cleanup();
}
size_t MyClass::writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
//buf is a pointer to the data that curl has for us
//size*nmemb is the size of the buffer
for (size_t c = 0; c<size*nmemb; ++c)
{
cerr << c << endl;
rawData_.push_back(buf[c]);
}
return size*nmemb; //tell curl how many bytes we handled
}
void MyClass::makeCall()
{
curl_easy_perform(curl_);
}
当我创建MyClass的实例并调用makeCall时,writeCallBack函数中存在一个段错误。即,buf的大小似乎为0(当c = 0时,buf [c]的调用会中断)。任何帮助表示赞赏
最佳答案
带有curl_easy_setopt
的CURLOPT_WRITEFUNCTION
的参数应为size_t function( char *ptr, size_t size, size_t nmemb, void *userdata)
类型。那是“干净的” C函数,而不是方法。
但据我所知,您正在传递非静态方法的地址。因此它将没有正确的签名(我猜它是非静态的,因为您在其中使用了rawData_
)。
现在,curl_easy_setopt
并不真正在乎-它需要您提供的一切。但是,当调用该函数时,会发生不好的事情。
我的建议是将writeCallback
声明为静态(甚至是非成员 friend ),并将userdata设置为this
(将curl_easy_setopt
与CURLOPT_WRITEDATA
结合使用)。然后,您可以将userdata参数转换为MyClass
并在函数内部使用它。
关于c++ - libcurl/cURL C++段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13537244/