curl_easy_perform在一个点后返回部分结果

时间:2012-06-07 16:21:28

标签: curl libcurl

我在我的代码中使用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或连接到响应指针?我希望我能够正确描述这种情况。

由于

P

2 个答案:

答案 0 :(得分: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函数的每个条目中,您希望在写入的最后一个位置之后将提供的数据存储到缓冲区中(请记住,提供的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;
}

这样的事情应该这样做。 (免责声明:我不打算尝试编译这个,但它应该有用)

答案 1 :(得分:0)

对于单个请求,CURLOPT_WRITEFUNCTION回调将被调用为none,one或MANY次。你的功能需要妥善处理。