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

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

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

任何见解都表示赞赏。

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

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

处理所有这些复杂性的最简单方法是使代码灵活 – 从sendto检测EMSGSIZE错误,如果得到它,则切换到使用较小的消息。 如果您想要进行路径MTU发现,也可以很好地工作,它通常会首先接受更大的消息,但是当您发送最终超过路径MTU的消息时,将减少最大消息大小。

如果你只是想避免担心它,1452字节或更少的发送可能总是很好(这是正常的IPv6头的1500字节正常以太网有效负载减去40,UDP头的8减去),除非你’重新使用VPN(在这种情况下,您需要担心封装开销)。