当阻塞'recv()'或'recvfrom()'时,tcp返回

当阻塞'recv()'或'recvfrom()'时,tcp返回,c,tcp,network-programming,C,Tcp,Network Programming,当使用阻塞样式时,将使用recv()或recvfrom(),如下所示 while(1){ recv(sock_fd, buf, n, 0); // when it returns and continue to execute the next line do_something(); ..... } 如果是UDP,recv()将在收到UDP数据包时返回 但对于TCP,因为它是字节流,所以似乎没有规则何时recv()应该返回。 有人能解释一下吗?感谢

当使用阻塞样式时,将使用
recv()
recvfrom()
,如下所示

 while(1){
     recv(sock_fd, buf, n, 0);    // when it returns and continue to execute the next line
     do_something();
     .....
   }
如果是UDP,
recv()
将在收到UDP数据包时返回

但对于TCP,因为它是字节流,所以似乎没有规则何时
recv()
应该返回。
有人能解释一下吗?感谢流套接字,
recv()
将在有任何数据可用时返回。这与
read()
(在非套接字文件描述符上)的规则相同。这意味着您可能只收到一个字节。当
recv()
(或
recvmsg()
recvfrom()
read()
)返回时,您将获得恰好可用且适合缓冲区的所有数据,因此您实际上很可能一次获得多个字节的数据,除非另一端只发送一个字节然后等待。

这意味着,通常,对于TCP,recv()将获得一个IP数据包?如果存在IP碎片,那么会发生什么?不,如果在内核有机会将第一个数据包中的数据交付给您之前,额外的数据包到达,您可能会得到多个IP数据包的数据。至于IP碎片,在重新组装完整的IP数据报之前,任何IP碎片中的数据都不会传送到任何更高层的协议,所以情况就完全不同了。@misteryes不,不是这样的。没有TCP数据包这样的东西。您可能会得到从一个字节到您提供的长度的任何内容,并且它可以在另一端跨任意数量的写入。