现在的位置: 首页 > 综合 > 正文

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

2018年05月05日 ⁄ 综合 ⁄ 共 791字 ⁄ 字号 评论关闭

        最近在代码中发现一个问题,我们的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————

抱歉!评论已关闭.