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

3

使用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.*工厂也无法获取此网络接口。
这个解决方案可靠吗?有没有更好的方法来实现我想要的功能?

请看这里:https://dev59.com/_Oo6XIcBkEYKwwoYLhPO - Shar1er80
1
显然,MulticastSocket.getNetworkInterface() 返回一个神奇的 0.0.0.0 NetworkInterface ,你无法通过其他方式获得它。如果调用了 MulticastSocket.setNetworkInterface() 它就不会这样做。有趣的是 NIO 版本没有单参数的 join() 方法。 - user207421
1个回答

1
我使用本地地址可以找到局域网设备!你也可以试试!例如: NetworkInterface IFC = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接