关于网络编程:UDP 多播上的 g_socket_bind 行为

g_socket_bind behavior on UDP multicast

我在单个系统上有多个阅读器,它们绑定到单个地址(IP:端口,例如 239.0.0.1:1234)。组中的另一台计算机向该组发送 UDP 多播数据包,读者应该会收到它。我使用了 GLib 2.0 网络堆栈,g_socket_bindallow_reuse 设置为 true.

当只有一个阅读器(单个套接字绑定到该地址)或最多三个阅读器时,一切正常,阅读器将正确接收数据包。但是当阅读器数量增加到四个或更多时,会发生丢包,并且随着系统上阅读器的数量线性增加。

If socket is a UDP socket, then allow_reuse determines whether or not other UDP sockets can be bound to the same address at the same time. In particular, you can have several UDP sockets bound to the same address, and they will all receive all of the multicast and broadcast packets sent to that address.

如 GIO 参考手册中所述,当 allow_reuse 设置为 true 时,所有读取器都应读取所有数据,但不会发生上述情况。

有人知道问题出在哪里吗?有内核相关的问题吗?


您的所有套接字都需要加入多播组。如果您只是依靠绑定来实现这一点,那么您将陷入未定义的行为。