我在我的代码中使用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
答案 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次。你的功能需要妥善处理。