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

标签 sockets udp

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

假设客户端调用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/

相关文章:

c - Recv 环形缓冲区与简单缓冲区

c - 使用套接字将空文件发送回客户端的简单 FTP

java - 我选择 UDP 作为我的 peer 2 peer 服务,我如何证明它在我的情况下是可靠的

c - recvfrom() 返回停止等待 UDP 中的值?

JAVA - Socket.accept() 卡住用户界面

c - 仅 GET 命令正文,缺少 header

python - 套接字等待连接超时

sockets - Erlang:在同一个端口上接收多个组播流

java - java 套接字问题,不会监听多个数据报包

c - GStreamer - 向元素发出信号