C++使用curl_easy_setopt()获取内容不完整

来源:互联网 发布:js json转成url编码 编辑:程序博客网 时间:2024/05/10 14:48

        最近在代码中发现一个问题,我们的C++框架中,使用Curl来获取数据,但是若数据长度较多时,获取的数据不完整,只有后半部分,推测是由于接受数据的缓冲区设置过小造成的。后来调大了缓冲区,问题还是没有解决。

        在我们的代码中,使用curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_memory_callback);函数来接受保存数据。这个函数调用回调函数write_memory_callback来保存数据,查看了一下write_memory_callback函数,代码如下:

static size_t write_memory_callback(void *contents, size_t size, size_t nmemb, void *userp){    size_t real_size = nmemb * size;    memcpy(userp, contents, real_size);    ((char*)userp)[real_size] = '\0';    return real_size;}

        这段函数中,使用了memcpy函数来将接受的内容保存到字符串中。

        问题原因已经很明显了,使用memcpy函数会将当前内容覆盖原字符串,这样字符串中保存的始终是最近一次接受的内容,所以每次返回的结果都是不完整的。

         产生这个问题的根源在于,回调函数处理的数据有最大值,定义在curl.h文件中CURL_MAX_WRITE_SIZE = 16k。若传送的数据超过限额,curl会自动分成多次传送,因此需要将字符串拼接起来才能得到完整的结果。

        解决方法:将memcpy换成strncat即可。


参考:

http://blog.chinaunix.net/uid-14351756-id-2820622.html


————The End————

0 0