recv接收数据的问题

琴乐音 2007-12-21 09:41:57
我在调用recv时 , 有时会取出的数据不完整, 就算我用大缓冲空间, 一次读socket的数据, 读的有时对,有时不对。 也就是recv返回的值和buf不等,小于buffer,而且前提是要接受的数据大于buffer。 这个是什么原因导致的呢?
while(1){
if(contentsize > SOCKET_MAX_BUF_LEN){
iRecvResult = recv(socket, recBuf, SOCKET_MAX_BUF_LEN, 0);
if(iRecvResult < recBuf){
//error
}
int isWrite = writeDownLoadFile(updateTempFile, recBuf, iRecvResult);
if(isWrite == -1){
syslog(LOG_INFO, "write temp file fail when update logic file\n");
}
memset(recBuf, 0, SOCKET_MAX_BUF_LEN);
contentsize -= iRecvResult;
}
else{
iRecvResult = recv(socket, recBuf, contentsize, 0);
if(iRecvResult < recBuf){
//error
}
int isWrite = writeDownLoadFile(updateTempFile, recBuf, iRecvResult);
if(isWrite == -1){
syslog(LOG_INFO, "write temp file fail when update logic file\n");
}
break;
}
}
...全文
154 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
szduweibing 2007-12-24
  • 打赏
  • 举报
回复
if(iRecvResult < recBuf)
将一个整数与一个指针比较大小,有何意义?
就算是与指针的大小来比较,也没有什么意义。一个是实际得到的数据长度,一个是buf的最大长度
悠悠长风 2007-12-24
  • 打赏
  • 举报
回复
循环读取。直到读完为止
琴乐音 2007-12-24
  • 打赏
  • 举报
回复
暂时这样做了,recv(socket, recBuf, SOCKET_MAX_BUF_LEN, 0);
最后一个参数的0改为MSG_WAITALL ,强制等待接受完毕再返回。
littlefirebug 2007-12-21
  • 打赏
  • 举报
回复
发送方发送的数据量,接收方并不一定能够全部取到.TCP协议是以字节流传输的.
mymtom 2007-12-21
  • 打赏
  • 举报
回复
if(iRecvResult < recBuf)不能算是出错,会返回已有的数据;应该做个循环来进行recv

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧