无法在 CURLOPT_WRITEFUNCTION 的回调中复制数据
Can't copy data inside of callback for CURLOPT_WRITEFUNCTION
我有一些数据块正在通过这个函数,我需要妥善保存它们。不幸的是,无论 dynamic/static 分配如何,memcpy 都无法按预期工作 - 内存已损坏,我不明白为什么。
size_t func(void* ptr, size_t size, size_t nmemb, void *stream) {
size_t realsize = nmemb*size;
WebRequest* webRequest = (WebRequest*)stream;
char* mem_ptr = (char*)malloc(nmemb*size+1);
/*char mem_ptr[realsize+1];*/
memcpy(&mem_ptr, &ptr, realsize);
mem_ptr[realsize+1] = 0;
string s(mem_ptr);
cout << mem_ptr << endl;
webRequest->addBody(s);
return nmemb*size;
}
您似乎把事情搞得比实际情况更复杂了。我不知道您的 WebRequest 是什么样子,因为您没有在示例中包含它,但这是将数据附加到 std::string
.
的简单示例
值得注意的是 memcpy(&mem_ptr, &ptr, realsize);
是不正确的。您已经有了指针,不需要传递它们的地址,但是如果您的最终目标是将数据放入 std::string
中,您应该直接这样做,如下所示。
#include <string>
#include <iostream>
#include <curl/curl.h>
#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Wldap32.lib")
size_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata)
{
size_t dataSize = size * nitems;
std::cout << "Receiving " << dataSize << " bytes.\n";
if (dataSize)
{
std::string& str = *(std::string*)userdata;
str.append(buffer, dataSize);
}
return dataSize;
}
int main()
{
curl_global_init(CURL_GLOBAL_WIN32);
CURL* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, read_callback);
std::string rawData;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &rawData);
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
//To try and make sure our callback is called more than once.
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 1024);
curl_easy_perform(curl);
std::cout << rawData;
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}
我有一些数据块正在通过这个函数,我需要妥善保存它们。不幸的是,无论 dynamic/static 分配如何,memcpy 都无法按预期工作 - 内存已损坏,我不明白为什么。
size_t func(void* ptr, size_t size, size_t nmemb, void *stream) {
size_t realsize = nmemb*size;
WebRequest* webRequest = (WebRequest*)stream;
char* mem_ptr = (char*)malloc(nmemb*size+1);
/*char mem_ptr[realsize+1];*/
memcpy(&mem_ptr, &ptr, realsize);
mem_ptr[realsize+1] = 0;
string s(mem_ptr);
cout << mem_ptr << endl;
webRequest->addBody(s);
return nmemb*size;
}
您似乎把事情搞得比实际情况更复杂了。我不知道您的 WebRequest 是什么样子,因为您没有在示例中包含它,但这是将数据附加到 std::string
.
值得注意的是 memcpy(&mem_ptr, &ptr, realsize);
是不正确的。您已经有了指针,不需要传递它们的地址,但是如果您的最终目标是将数据放入 std::string
中,您应该直接这样做,如下所示。
#include <string>
#include <iostream>
#include <curl/curl.h>
#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Wldap32.lib")
size_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata)
{
size_t dataSize = size * nitems;
std::cout << "Receiving " << dataSize << " bytes.\n";
if (dataSize)
{
std::string& str = *(std::string*)userdata;
str.append(buffer, dataSize);
}
return dataSize;
}
int main()
{
curl_global_init(CURL_GLOBAL_WIN32);
CURL* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, read_callback);
std::string rawData;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &rawData);
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
//To try and make sure our callback is called more than once.
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 1024);
curl_easy_perform(curl);
std::cout << rawData;
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}