当前位置:  开发笔记 > 运维 > 正文

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

如何解决《C中sendto函数允许的最大缓冲区长度是多少》经验,为你挑选了1个好方法。

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

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

任何见解都表示赞赏.



1> Chris Dodd..:

没有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(在这种情况下,您需要担心封装开销).

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有