sendto() + recvfrom() 缓冲区混淆数据报

sendto() + recvfrom() buffer confusion Datagram

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

假设客户端两次调用sendto(),每次向服务器发送100字节的数据报。 然后,如果服务器使用 200 字节的接收缓冲区调用 recvfrom(),它会将两个数据报接收到同一个缓冲区吗?

从我学到的.. 如果我执行 sendto(100) ,那么我将在同一数据报传输 "space"

上接收回 recvfrom(100)

但是因为它发送了两次 100..那么 recvfrom(200) 会在不同的缓冲区上吗?

谢谢。

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

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

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

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

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

对于 UDP,一个 recv(2) consumes exactly one input datagram. Larger SO_RCVBUF 值允许在内核中缓冲更多的数据报,但不要 "glue" 它们在一起。

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