对一个概念感到困惑...
假设客户端调用sendto()两次,每次发送100字节的数据报到服务器。 那么,如果服务器使用 200 字节的接收缓冲区调用 recvfrom(),它是否会将两个数据报接收到同一个缓冲区中?
据我所知.. 如果我执行 sendto(100) ,那么我将在同一个数据报传输“空间”上接收回 recvfrom(100)
但是由于它发送了 100 次中的两次..recvfrom(200) 会在不同的缓冲区上吗?
谢谢。
最佳答案
因为你使用的是UDP,如果你调用sendto 2次,你也会有2次recvfrom。完全保留数据包的内容。如果您发送 100 字节的 2 倍,您将永远不会收到 200 字节。
我必须警告您,UDP 是尽力而为。有可能数据包被丢弃,并且您只收到一个数据包(第一个或第二个),甚至根本没有数据包。
另一个警告,您必须确保接收缓冲区足够大,在您的描述中这是可以的,但是如果接收缓冲区太小,一些实现会丢弃数据包,一些实现会将其截断。
UDP 实际上是 IP 之上的一个非常薄的层。 IP 负责将数据包从一端传送到另一端。从用户的角度来看,正在发送的数据包未受影响。
关于sockets - sendto() + recvfrom() 缓冲区混淆数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015205/