使用DatagramChannel加入组播组而不指定网络接口

时间:2015-05-31 23:09:49

标签: java networking multicast datagram

使用java的多播套接字时,我可以使用以下代码加入多播组,而无需指定NetworkInterface

MulticastSocket sock = new MulticastSocket(PORT);
sock.joinGroup(ADDR);

另一方面,如果我想使用NIO,我可以这样做:

DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
        .setOption(StandardSocketOptions.SO_REUSEADDR, true)
        .bind(new InetSocketAddress(PORT))
        .setOption(StandardSocketOptions.IP_MULTICAST_IF, IFC);

dc.join(ADDR, IFC);

其中IFC是我感兴趣的NetworkInterface。 如果我事先不知道网络接口,我如何加入像MulticastSocket?

这样的组

我找到的一个解决方案是使用此代码:

MulticastSocket msock = new MulticastSocket();
NetworkInterface ifc = msock.getNetworkInterface();
msock.close();
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
        .setOption(StandardSocketOptions.SO_REUSEADDR, true)
        .bind(new InetSocketAddress(PORT))
        .setOption(StandardSocketOptions.IP_MULTICAST_IF, ifc);

dc.join(ADDR, ifc);

令人惊讶的是,这段代码按预期工作并执行,当查看MulticastSocket.getNetworkInterface()方法返回的NetworkInterface时,我看到它返回了一个名为" 0.0.0.0"的接口。这当然不存在。此外,无法与任何NetworkInterface.*工厂

建立此网络接口

解决方案可靠吗?任何人都可以解释为什么它有效,如果有更好的方法来实现我想要的东西?

1 个答案:

答案 0 :(得分:0)

我使用本地地址可以找到局域网设备!所以你可以尝试一下! 例如 $rootScope.$on( "$routeChangeSuccess", ... )