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