使用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.*
工厂也无法获取此网络接口。这个解决方案可靠吗?有没有更好的方法来实现我想要的功能?
MulticastSocket.getNetworkInterface()
返回一个神奇的0.0.0.0 NetworkInterface
,你无法通过其他方式获得它。如果调用了MulticastSocket.setNetworkInterface()
它就不会这样做。有趣的是 NIO 版本没有单参数的join()
方法。 - user207421