我正在使用UDP套接字实现一个简单的网络堆栈,我希望从客户端向服务器发送大约1 MB的字符串数据.但是,我不知道sendto()
C 中的UDP API中的长度是否有限制.如果存在限制并且sendto()
不会处理超出限制的打包,那么我将不得不手动将字符串拆分为更小的块然后发送它们.
缓冲区的长度是否有限制?或者sendto()
API是否自己处理打包.
任何见解都表示赞赏.
没有API限制sendto
- 它可以处理底层协议的任何大小.
UDP-64K的数据包限制; 如果超过此值,则sendto
呼叫将失败并显示EMSGSIZE
错误代码.IP的数据包大小限制在IPv4和IPv6之间也有所不同.最后,低级传输具有MTU大小,这可能是也可能不是问题.除非您使用IP_OPTIONS
setsockopt
调用来禁用碎片,否则可以将IP数据包分成多个较低级别的数据包并自动重新组合.
处理所有这些复杂性的最简单方法是使代码灵活 - 检测EMSGSIZE
错误sendto
并切换到使用较小的消息.如果您想要进行路径MTU发现,这也很有效,它通常会首先接受更大的消息,但是当您发送最终超过路径MTU的消息时,将减少最大消息大小.
如果你只是想避免担心它,1452字节或更少的发送可能总是很好(这是正常IPv6头的1500字节正常以太网有效负载减去40而UDP标头是8),除非你'重新使用VPN(在这种情况下,您需要担心封装开销).