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

时间:2014-03-31 22:24:52

标签: c sockets udp

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

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

感谢任何见解。

1 个答案:

答案 0 :(得分:6)

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

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

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

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