gpt4 book ai didi

sockets - 接收整个 UDP 数据报,不管大小?

转载 作者:行者123 更新时间:2023-12-03 12:01:26 27 4
gpt4 key购买 nike

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

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

最佳答案

大多数理智的基于 UDP 的协议(protocol)不会超过 MTU减少 IP 和 UDP header 以避免 IP fragmentation .例如。对于大于 512 字节的消息,DNS 切换到 TCP。因此,除非您的网络使用巨型帧,否则使用 1472 字节的缓冲区(1500 以太网 MTU - 20 用于不带选项的 IP header - 8 UDP header )可能是安全的。这当然取决于 UDP 之上的应用程序协议(protocol)。

如果您真的很偏执(或使用未知协议(protocol)),您可以使用 MSG_PEEKMSG_TRUNC标志首先确定大小,然后分配足够大的缓冲区(参见 recv(2) )。

关于sockets - 接收整个 UDP 数据报,不管大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12411131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com