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)
,它可以在一个系统调用中读取多个数据报。
对一个概念感到困惑...
假设客户端两次调用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)
,它可以在一个系统调用中读取多个数据报。