TCP中,send一个缓冲区的数据,是否用一个recv就可接收完整

2024-05-09 07:28

1. TCP中,send一个缓冲区的数据,是否用一个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的缓冲区足够大。 
会的。 
也可能两次发的一次全收到。

TCP中,send一个缓冲区的数据,是否用一个recv就可接收完整