2010-07-20 114 views
10

我知道默认的最大缓冲区大小可以用于这些函数65507(5535 - IPv4标头 - UDP标头)。但是,有没有办法改变这一点?我需要能够发送更大的缓冲区〜66000字节。我尝试使用setsockopt()函数,但它似乎没有工作。UDP sendto()和recvfrom()最大缓冲区大小

谢谢!

+0

难道你不能分割你的缓冲区,用额外的位标记它来知道顺序吗? – Scharron 2010-07-20 16:44:21

+0

这看起来像我不得不想出这样的计划。 – 2010-07-20 16:50:15

+1

5535应该是65535 – kumar 2014-10-10 12:08:35

回答

12

UDP只提供了一个数据报作为一个IP包的数据部分,一个IP包具有这样的数据限制到2^16字节,包括标头,或65507个字节16比特长度字段UDP数据部分(假设没有ipv4选项),除了将数据分成多个数据包并自行处理重组外,没有办法使用UDP处理更大的数据包。

+0

感谢您的澄清。 – 2010-07-20 16:50:32

6

UDP规范在数据包大小的UDP报头中提供了16位,这意味着您不能一次发送超过65k。你不能改变这一点。

你必须将你的数据分成多个数据包。 使用TCP而不是UDP会使事情变得简单多了,因为保证了完整性和接收顺序。

+1

+1代替建议TCP。 – Matt 2011-12-12 09:01:08

8

此外,它很可能会丢失“大”的UDP数据包,因为封装的IP数据包可能因为限制而被分段。每个片段可能会丢失,UDP中没有恢复机制。所以虽然UDP有效载荷的理论限制是大约。 64kB的实际限制是1kB左右。

+4

这是一个重要的观点。一个65500字节的UDP数据包被分割成以太网大小的片段,将使1%的基础片段丢失率变成大约37%的UDP数据包丢失率。大UDP包 - 不要这样做! – caf 2010-07-20 23:17:45

+0

我在哪里工作,通过在私有子网上使用专用接口来处理UDP数据包(和静态ARP条目以防止周期性ARP丢弃),从而解决了此问题。如果您不能这样做,请为丢弃的数据包做好准备。 – 2012-07-23 19:05:38