2013-04-30 161 views
1

我使用recvfrom来接收udp组播数据。据我所知,它在调用中接收的数据报不超过1个(是否正确?)。那么什么样的缓冲区大小足够用于这样的通话呢?我猜这应该是〜这台机器的UDP的MTU,但我怎么能知道它在运行时?recvfrom的UDP情况下缓冲区的大小是否足够?

我不想“高估”缓冲区的大小,因为我实际上在场景下有缓冲区的缓冲区,我不想花费太多额外的内存。

+0

我想这可能是udp生成碎片(http://www.pcvr.nl/tcpip/udp_user.htm)。所以,我认为最好的选择是分配一个等于以太网MTU(1500字节)的缓冲区,并使用从recvfrom读取的位数来决定是否需要执行另一个分配来完成读取。 – Amadeus 2013-04-30 20:15:24

+0

@TomásBadan我不认为UDP可能会碎片化。我要么有完整的数据报,要么没有。 – javapowered 2013-04-30 20:19:29

+0

看看我之前发布的页面,在那里你会发现一个例子,其中UDP碎片是由tcpdump获得的。 (3 \t 50.449704(29.4414)\t bsdi.lll6> svr4.discard:udp 1473(frag 26304:1480 @ 0 +) – Amadeus 2013-04-30 20:22:51

回答

0

UDP数据报的最大大小是64k。除非你分配了很多缓冲区,只需使用这个大小。

+0

这似乎是正确的。然而在我的特殊情况下,在我的特定udp数据供应商说,最大大小=以太网MTU,所以我刚刚使用了1600字节的缓冲区长度。 – javapowered 2013-05-01 09:25:49

0

的IPv4 UDP数据报有效载荷的最大大小为65507个字节,但你不会让他们除了经由回送。通过真实网络可以做的最好的方法是MTU减去28.没有碎片的普遍接受的实际限制是534字节。

+0

udp数据报可以被实际碎片化。即以几个网络分组传送。所以有可能通过网络发送64k的数据报。 – javapowered 2013-05-01 10:04:03

+0

我可以第二次javapowered。我们在Windows和Linux上成功地使用64k数据报通过以太网进行UDP多播。 – eile 2013-05-01 17:37:01

+0

它可以被分割,但建议避免这种情况,因为如果你丢失了一个碎片,你会丢失整个数据包(并且与UDP一样,你不知道它)。即它增加了数据包丢失的可能性。 – markmnl 2013-05-06 13:29:14