0

我在我的代码中使用 libcurl,curl_easy_perform() 的前几次尝试返回了正确的值,但之后我看到前 800 个左右的字节被丢弃了。传递的指针 write_data 函数开始指向前 800 个字节左右之后的流。

这是我使用的代码片段 -

ctx = curl_easy_init();
curl_easy_setopt(ctx, CURLOPT_POSTFIELDS, bodyData);
curl_easy_setopt(ctx, CURLOPT_URL, serverUrl);
curl_easy_setopt(ctx, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(ctx, CURLOPT_WRITEDATA, response);
res = curl_easy_perform(ctx);
curl_easy_cleanup(ctx);

编辑:好的,所以我看到对于某些请求,write_data 为一个 curl_easy_perform() 调用了两次。所以 write_data 获取前 x 个字节,然后在下一次读取剩余的字节。但是我的 write_data 函数每次都会覆盖响应指针。我如何知道我是否需要 memcpy 或连接到响应指针?我希望我能够正确地描述情况。

谢谢

4

2 回答 2

3

您需要提供一个大缓冲区(您的“响应”指针),并且每次调用 write_data 函数时,您都会将更多数据附加到缓冲区。您的响应指针可能应该指向 struct,如下所示:

struct myStruct{
    char *buffer; /* remember to malloc this! */
    int size; /* 100000 */
    int used; /* initially 0 */
};
typedef struct myStruct myStruct;

然后,在 write_data 函数的每个条目上,您希望在写入的最后一个位置之后将提供的数据 memcpy 到缓冲区中(请记住,提供给 write_data 的缓冲区不一定是空终止的),例如:

size_t write_data( char *ptr, size_t size, size_t nmemb, void *userdata)
{
    myStruct *parseBuf = (myStruct *)userdata;
    int total_size = size * nmemb;
    memcpy(parseBuf->buffer+parseBuf->used, ptr, total_size);
    parseBuf->used += total_size;
    *(parseBuf->buf+parseBuf->used) = 0; /* Add a null terminator on */
    return size * nmemb;
}

应该这样做。(免责声明:我没有费心尝试编译它,但它应该可以工作)

于 2012-06-07T20:00:56.573 回答
0

对于单个请求,CURLOPT_WRITEFUNCTION 回调将被调用一次或多次。您的函数需要正确处理。

于 2012-06-07T17:44:32.043 回答