linux下用使用CURL接收数据不全,大神们帮忙看看。
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);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)