Присоединиться к многоадресной группе с помощью DatagramChannel без указания сетевого интерфейса
При использовании многоадресного сокета 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);
Удивительно, но этот код работает и работает, как и ожидалось, при просмотре NetworkInterface, возвращаемого MulticastSocket.getNetworkInterface()
Метод Я видел, что он возвратил интерфейс с именем "0.0.0.0", который, конечно, не существует. Кроме того, нет никакого способа получить этот сетевой интерфейс с любым из NetworkInterface.*
фабрики
Является ли решение надежным? Может кто-нибудь объяснить, почему это работает, и если есть лучший способ добиться того, чего я хочу?
1 ответ
Я с помощью локального адреса могу найти устройства LAN! так что вы можете попробовать это! например
NetworkInterface IFC = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());