TCP中,send一个缓冲区的数据,是否用一个recv就可接收完整
1个回答
展开全部
不一定的。
TCP是流式套接字,你所面对的只是一个字符流。它只能保证各个字节按顺序到达,不会乱序。至于分几次,每次几个,说不准。
总而言这,TCP不是“面向消息”的。你如果需要基于消息的机制,只能自己制定应用层的协议(比如通过长度或者特殊的信息来标记消息的开始和结束),然后自己写代码进行封装。
假如send一次,是不是会有情况要recv两次才能收全?
recv的缓冲区足够大。
recv有返回值,为每次收到长度,
你收的时候,判断一下,有没有收全,
至于几次不好说,
TCP出错的话会重发的
tcp是不分包的
所以你得循环来收
最好加个长度
int iLen=50
int curLen=0;
while((curLen=recv(...,iLen))>0){
iLen-=curLen;
if(iLen<=0)
break;
}
tcp有可能粘包,所接受端要做分包处理。upd就不用了这样做了。
tcp有可能粘包,所接受端要做分包处理。udp就不用了这样做了
假如send一次,是不是会有情况要recv两次才能收全?
recv的缓冲区足够大。
会的。
也可能两次发的一次全收到。
TCP是流式套接字,你所面对的只是一个字符流。它只能保证各个字节按顺序到达,不会乱序。至于分几次,每次几个,说不准。
总而言这,TCP不是“面向消息”的。你如果需要基于消息的机制,只能自己制定应用层的协议(比如通过长度或者特殊的信息来标记消息的开始和结束),然后自己写代码进行封装。
假如send一次,是不是会有情况要recv两次才能收全?
recv的缓冲区足够大。
recv有返回值,为每次收到长度,
你收的时候,判断一下,有没有收全,
至于几次不好说,
TCP出错的话会重发的
tcp是不分包的
所以你得循环来收
最好加个长度
int iLen=50
int curLen=0;
while((curLen=recv(...,iLen))>0){
iLen-=curLen;
if(iLen<=0)
break;
}
tcp有可能粘包,所接受端要做分包处理。upd就不用了这样做了。
tcp有可能粘包,所接受端要做分包处理。udp就不用了这样做了
假如send一次,是不是会有情况要recv两次才能收全?
recv的缓冲区足够大。
会的。
也可能两次发的一次全收到。
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询