Присоединиться к многоадресной группе с помощью 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());

Другие вопросы по тегам