linux下用使用CURL接收数据不全,大神们帮忙看看。
- C/C++ code
char res_buf[409600 + 1];size_t copy_data(void *ptr, size_t size, size_t nmemb, void *stream){ memcpy(res_buf + strlen(res_buf), ptr, size * nmemb); return strlen(res_buf);} curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl,CURLOPT_URL,des_addr); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,copy_data); curl_easy_setopt(curl,CURLOPT_WRITEDATA,res_buf); curl_easy_setopt(curl,CURLOPT_POST, 1); curl_easy_setopt(curl,CURLOPT_VERBOSE,1); curl_easy_setopt(curl,CURLOPT_HEADER,0); headers =curl_slist_append(headers,"Content-Type: text/html"); curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers); } curl_easy_setopt(curl,CURLOPT_POSTFIELDS,res_data);我使用tcpdump抓包工具可以抓到对方发给我的完整的包,但是我就后来不会接收完整。我怀疑是那些设置的问题,每次copy_data这个函数都调用了两次。请大家帮我看看,帮我出出主意吧。万分感谢
[解决办法]
- HTML code
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
[解决办法]
char res_buf[409600 + 1]; //这个初始化得清0
size_t copy_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
memcpy(res_buf + strlen(res_buf), ptr, size * nmemb); //请在结尾加'\0'
return strlen(res_buf); //return 的应该是size*nmemb
}
[解决办法]
其他不看,单就这一句肯定错,不能假定对端发来的数据是非'\0'字节。
memcpy(res_buf + strlen(res_buf)