2012-06-07 58 views
0

我在我的代码中使用libcurl,curl_easy_perform()的前几次尝试返回正确的值,但在此之后,我看到第一个800左右的字节被删除。传递指针write_data函数在第一个800字节左右后开始指向流。curl_easy_perform在点后返回部分结果

下面是代码,我使用片段 -

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); 

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

由于

P

+0

https://curl.haxx.se/libcurl/c/getinmemory.html中有一个工作代码 – danielapsmaior

回答

3

您需要提供一个大缓冲区(您的“响应”指针),并且每次调用write_data函数时,都会向缓冲区追加更多数据。您的回答指针可能应该指向结构,像这样:

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

然后,在每一个进入你想你写的最后一个位置后,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; 
} 

这样的事情应该这样做。 (免责声明:我没有打算编译这个,但它应该可以工作)

+0

这正是我发现的。谢谢回复 – user220201

0

的CURLOPT_WRITEFUNCTION回调将被称为无,一个或多次为单个请求。你的功能需要正确处理。

+0

是的。这也是我意识到的。 – user220201