无法在 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;
}