我有一个多播服务器,它不断地发送多播数据包。有一个侦听器正在同一台机器上侦听此数据(环回多播)。当只有一个侦听器实例正在运行时,我看不到数据包丢失,但是一旦我运行多个实例,我看到两个侦听器实例都丢弃了数据包。有人可以解释为什么会发生这种情况以及是否有任何开源解决方案来解决这个问题?提前致谢!
问问题
2699 次
1 回答
3
UDP 不提供任何可靠性机制。这意味着如果第 3 层数据包丢失,则无法恢复。
在 localhost 连接上,数据包可能会因队列溢出而丢失。如果应用程序临时写入数据的速度快于操作系统为队列提供服务的速度,则传输队列可能会溢出。同样,如果应用程序读取数据的速度不够快,接收队列可能会溢出。如果有两个侦听器,系统会做更多的工作,因此更有可能发生溢出。
在 Linux 中,netstat -su 将显示 RcvbufErrors 和 SndbufErrors。您可以使用 setsockopt SO_SNDBUF 和 SO_RCVBUF 增加这些缓冲区的大小。这些值受 /proc/sys/net/core/wmem_max 和 rmem_max 的限制。
在 Windows 中,似乎可以使用相同的 socktopts,并且可以像在此处所做的那样更改默认值。
于 2015-06-09T22:54:59.973 回答