在TCP套接字编程中,如果recv()
返回0,表示对方关闭了连接。然而,据我所知,TCP RFC 并不强制要求 TCP 的有效负载 > 0。因此,理论上,TCP 堆栈可以接收有效负载为 0 的消息。
所以,本质上我的问题是recv()
如果接收到有效负载大小为 0 的数据包,则返回?如果返回0,那么我们如何区分它和关闭连接指示。
有效负载大小为 0 的 TCP 段无处不在 - 它们几乎出现在每个现实世界的 TCP 流中。每当一方希望确认收到另一方的数据但没有自己的数据可发送时,就会发送它们。 (这些通常称为“ACK 数据包”,但“ACK 数据包”只是一个恰好不包含数据的常规段)。
由于此类数据包不包含任何要传递给用户应用程序的数据,因此它们不会导致recv()
回来 -recv()
将继续阻塞,直到一些实际数据到达。如果recv()
返回 0,则明确指示另一端已关闭其一侧的连接,并且不会再发送任何数据。
请记住 TCP 是面向流的:有not单个返回的数据之间的 1 对 1 映射recv()
调用和单个 TCP 段中的数据。单个recv()
调用可能会返回一个与多个 TCP 段重叠的数据块,并且单个 TCP 段中的数据可能会在多个 TCP 段中返回recv()
来电。 TCP 段之间的边界对于使用 BSD 套接字 API 的应用程序来说是不可见的。如果您想要这样的边界,您需要使用 TCP 流中的应用程序层协议自行实现,或者使用面向数据报的协议(如 UDP)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)