当多个listner实例正在运行时,数据包会丢弃

时间:2015-06-09 07:30:08

标签: networking network-programming udp multicast packet-loss

我有一个不断发送组播数据包的组播服务器。有一个侦听器在同一台机器上侦听此数据(环回多播)。当只有一个侦听器实例正在运行时,我看不到数据包丢失,但是一旦我运行多个实例,我看到两个侦听器实例都丢弃了数据包。有人可以解释为什么会发生这种情况以及是否有任何开源解决方案来解决这个问题? 提前谢谢!

1 个答案:

答案 0 :(得分:3)

UDP不提供任何可靠性机制。这意味着如果第3层数据包丢失,则无法恢复它。

在localhost连接上,队列溢出会丢失数据包。如果应用程序临时写入数据的速度比OS可以为队列服务的速度快,则传输队列可能会溢出。同样,如果应用程序没有足够快地读取数据,则接收队列可能会溢出。有两个监听器,系统正在做更多工作,因此溢出更有可能。

在Linux中,netstat -su将向您显示RcvbufErrors和SndbufErrors。您可以使用setsockopt SO_SNDBUF和SO_RCVBUF来增加这些缓冲区的大小。这些值受/ proc / sys / net / core / wmem_max和rmem_max限制。

在Windows中,似乎有相同的socktopts可用,默认值可以像here一样进行更改。