代码之家  ›  专栏  ›  技术社区  ›  Aditya Sehgal

如果recv()接收到负载大小为0的有效TCP数据包,它将返回什么值

  •  5
  • Aditya Sehgal  · 技术社区  · 14 年前

    在TCP套接字编程中,如果 recv() 返回0,表示对方已关闭连接。但是,AFAIK,TCP RFC并不要求TCP的有效负载为>0因此,理论上,TCP堆栈可以接收有效负载为0的消息。

    接收() 如果接收到大小为0的有效负载数据包,则返回?如果它返回0,那么我们如何区分它与闭合连接指示。

    2 回复  |  直到 14 年前
        1
  •  11
  •   caf    14 年前

    有效负载大小为0的TCP段无处不在—它们几乎出现在每个真实世界的TCP流中。当一方希望确认接收到另一方的数据,但自己没有数据要发送时,就会发送它们(这些通常被称为“ACK包”,但是“ACK包”只是碰巧不包含数据的常规段。

    因为这样的包不包含任何要传递给用户应用程序的数据,所以它们不会导致 recv() 接收() 将继续阻塞,直到一些实际数据到达。如果 接收() 返回0,则表示另一端已关闭其连接端,不再发送任何数据。

    单个数据库返回的数据之间的1对1映射 接收() 调用可能返回与多个TCP段重叠的数据块,并且单个TCP段中的数据可能以多个格式返回 电话。TCP段之间的边界对于使用BSD套接字API的应用程序不可见。如果您想要这样的边界,您需要在TCP流中使用应用层协议来实现自己,或者使用面向数据报的协议(如UDP)。

        2
  •  3
  •   Andrey Vlasovskikh    14 年前

    对,根据POSIX if recv 退货 0

    如果有人成功地发送了一个负载为零的TCP数据包,那么操作系统 不必返回任何数据 正在阻止的进程

    请记住,TCP有效负载形成了一个连续的流,可以由操作系统随机切片,而不是在单个系统调用期间必须返回的数据报序列。