Не удается скопировать данные внутри обратного вызова для CURLOPT_WRITEFUNCTION - PullRequest
0 голосов
/ 12 мая 2018

У меня есть несколько порций данных, проходящих через эту функцию, и мне нужно правильно их сохранить. К сожалению, 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;
}

1 Ответ

0 голосов
/ 13 мая 2018

Кажется, что вы можете сделать это более сложным, чем нужно.Я не знаю, как выглядит ваш 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;
}
...