【问题标题】:sendto() + recvfrom() buffer confusion Datagramsendto() + recvfrom() 缓冲区混淆数据报
【发布时间】:2015-05-03 14:50:28
【问题描述】:

对一个概念感到困惑......

假设客户端调用 sendto() 两次,每次向服务器发送 100 字节的数据报。 那么如果服务器调用recvfrom(),接收缓冲区为200字节,是否会将两个数据报都接收到同一个缓冲区中?

从我学到的.. 如果我做 sendto(100) ,那么我将在同一个数据报传输“空间”上接收回 recvfrom(100)

但是由于它被发送了两次 100..recvfrom(200) 会在不同的缓冲区上吗?

谢谢。

【问题讨论】:

    标签: sockets udp


    【解决方案1】:

    因为你使用的是 UDP,如果你调用 sendto 2 次,你也会有 2 个 recvfrom。完全保留数据包的内容。如果您发送 2 次 100 字节,您将永远不会收到 200 字节。

    我必须警告你,UDP 是最好的努力。有可能数据包被丢弃,而您只收到一个数据包,第一个或第二个数据包,甚至根本没有数据包。

    另一个警告,你必须确保接收缓冲区足够大,在你的描述中这是可以的,但是如果接收缓冲区太小,一些实现会丢弃数据包,一些实现会将其切断。

    UDP 实际上是 IP 之上的一个非常薄的层。 IP是将数据包从一端传递到另一端的人。从用户的角度来看,正在发送的数据包没有受到影响。

    【讨论】:

      【解决方案2】:

      对于 UDP,一个recv(2) 只消耗一个输入数据报。较大的SO_RCVBUF 值允许在内核中缓冲更多数据报,但不要将它们“粘合”在一起。

      如果你在Linux上,它提供了一个不可移植的recvmmsg(2),可以在一个系统调用中读取多个数据报。

      【讨论】:

        【解决方案3】:

        取决于协议。对于 TCP 等流协议,没有消息边界,您可以完全感知任何分块。对于基于消息的协议,例如 UDP 消息被保留,您将读取 100 个字节两次(假设数据包没有丢失)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-24
          相关资源
          最近更新 更多