我正在尝试在创建MulticastSocket后加入组播组。
做一些类似的事情:
MulticastSocket mySocket = new MulticastSocket(4444);
mySocket.joinGroup(InetAddress.getByName("230.0.0.1")); // as an example工作正常。但是,当我使用接受SocketAddress作为参数的MulticastSocket构造函数时,多播组没有加入,需要对joinGroup()进行单独的调用。
MulticastSocket mySocket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));为什么会这样呢?
谢谢!
发布于 2011-05-26 12:21:41
除非我错了,组播是通过向本地网络交换机注册来实现的(使用发送IGMP消息的joinGroup方法),然后交换机会将发送到组播地址的所有数据包转发到每个已注册的设备。如果您不调用joinGroup,则不会发送任何组注册消息,本地交换机不知道您关心这些消息,因此您实际上不会收到任何消息。
一些交换机在发送方面比其他交换机更严格:我见过一些交换机,在这些交换机上,设备可以在不注册的情况下发送到组播组,但不能接收发送到组播组的数据包;我还看到过其他交换机,设备必须注册才能成功发送到组播组的其他成员,或者接收发送到组播组的数据包。
发布于 2011-05-26 12:16:02
我认为这就是组播协议/RFC的设计方式。在调用"joinGroup“之前,应用程序将忽略所有多播数据报。它是让应用程序接受数据包的"joinGroup“。
点击此处了解更多信息:http://tldp.org/HOWTO/Multicast-HOWTO-2.html
有关详细信息,请转到上面链接中的加入多播组。。
发布于 2011-05-26 14:13:07
如果您不使用组地址构建MulticastSocket,则必须以其他方式加入该组。否则,您为什么要收到该组的任何消息?
注意,使用组地址构造并不能在所有平台上工作AFAIK。实际上,指定接受SocketAddress的构造函数将其用作本地绑定地址,而不是多播组。我相信指定组地址在Linux上是有效的,但在其他平台上就不行了。我会按照文档中的方式使用它,并显式地调用joinGroup()。请注意,在多宿主主机上,您可能需要为每个可用的NIC调用joinGroup()。
https://stackoverflow.com/questions/6133480
复制相似问题