gpt4 book ai didi

c - C中sendto函数允许的最大缓冲区长度是多少

转载 作者:太空狗 更新时间:2023-10-29 16:07:31 26 4
gpt4 key购买 nike

我正在使用 UDP 套接字实现一个简单的网络堆栈,我希望从客户端向服务器发送大约 1 MB 的字符串数据。但是,我不知道 C 中 UDP sendto() API 中的长度大小是否有限制。如果有限制和 sendto()不会处理超出限制的打包,那么我将不得不手动将字符串拆分为更小的 block ,然后发送它们。

缓冲区的长度有限制吗?或者 sendto() API 是否自行处理打包。

欢迎任何见解。

最佳答案

sendto 没有 API 限制——它可以处理底层协议(protocol)可以处理的任何大小。

UDP 有数据包限制 -- 64K;如果超出此范围,sendto 调用将失败并显示 EMSGSIZE 错误代码。 IP 也有数据包大小限制,IPv4 和 IPv6 之间有所不同。最后,低层传输有一个 MTU 大小,这可能是也可能不是问题。 IP 数据包可以分成多个较低级别的数据包并自动重新组合,除非您使用 IP_OPTIONS setsockopt 调用来禁用分段。

处理所有这些复杂性的最简单方法是使您的代码灵活——检测 sendto 中的 EMSGSIZE 错误,如果您收到错误,则切换到使用更小的消息。如果您想进行路径 MTU 发现,这也很有效,它通常一开始会接受较大的消息,但当您发送最终超过路径 MTU 的消息时,它会减少最大消息大小。

如果您只是想避免担心它,发送 1452 字节或更少的字节可能总是没问题(这是 1500 字节的普通以太网有效负载,对于普通 IPv6 header 最大减去 40,对于 UDP header 减去 8),除非您使用的是 VPN(在这种情况下您需要担心封装开销)。

关于c - C中sendto函数允许的最大缓冲区长度是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22773391/

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