接收完整的UDP数据报,无论大小?

8
考虑通过套接字发送100字节的情况。使用TCP套接字,如果我调用长度为50的recv(),我会得到前50个字节,如果再次调用它,我会得到后50个字节。使用UDP套接字,如果我调用长度为50的recvfrom(),我会得到前50个字节,但是我无法检索第二个50个字节,因为后续对recvfrom()的调用会阻塞,直到下一个数据报被接收。

这是否意味着,如果我想要接收完整的UDP数据报(无论大小),我必须分配一个64k缓冲区(UDP允许的最大值)?如果我使用connect()我的UDP套接字,这会改变行为吗?或者说,基于UDP运作的协议通常包含应该用于缓冲区的已知最大数据包大小吗?

1个回答

2
大多数理智的基于UDP的协议不会超过MTU减去IP和UDP头部的长度以避免IP分片。例如,DNS在消息大于512字节时切换到TCP。因此,除非您的网络使用巨型帧,否则使用1472字节的缓冲区(1500以太网MTU-20 IP头部没有选项-8 UDP头部)可能是安全的。当然,这取决于UDP之上的应用程序协议。
如果您真的很谨慎(或正在使用未知协议),可以使用MSG_PEEKMSG_TRUNC标志首先确定大小,然后分配足够大的缓冲区(请参见recv(2))。

在FreeBSD上,似乎没有将MSG_TRUNC定义为输入标志(https://www.freebsd.org/cgi/man.cgi?query=recv&sektion=2)。 - redfast00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接