Какой правильный и рабочий способ транслировать UDP-пакет в Java? - PullRequest
7 голосов
/ 24 ноября 2011

Мне нужно транслировать пакет UDP на каждом сетевом интерфейсе.Сначала я пытался вещать на 255.255.255.255, но безрезультатно, а потом обнаружил, что это «устарело в течение примерно 20 лет».Поэтому я попытался выполнить итерацию на каждом сетевом интерфейсе, чтобы получить широковещательный адрес интерфейса и затем отправить пакет UDP по этому адресу.

Тем не менее, следующий код:

public static Collection<InetAddress> getBroadcastAddresses() {
    try {
        Collection<InetAddress> result = new LinkedList<InetAddress>();
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
                for (InterfaceAddress address : netint.getInterfaceAddresses()) {
                    InetAddress broadcastAddress = address.getBroadcast();
                    if (broadcastAddress != null)
                        result.add(broadcastAddress);
                }
        return result;
    } catch (SocketException e) {
        throw new RuntimeException(e);
    }
}

public static void broadcast(int port, DatagramPacket packet,
        DatagramSocket socket, PrintWriter logger) throws IOException {

    packet.setPort(port);

    for (InetAddress address : getBroadcastAddresses()) {
        logger.println("Broadcasting to: "+address);
        packet.setAddress(address);
        socket.send(packet);
    }

}

печатаетэтот материал:

Broadcasting to: /0.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255

, который действительно раздражает.Должен ли я получать IP-адрес и маску сети для каждого сетевого интерфейса и выполнять побитовые операции для «построения» правильного широковещательного адреса? Мне кажется, что это похоже на программирование сокетов Unix на C ... Существует ли чистый, Java-способ аккуратно доставить несчастный пакет UDP всем собеседникам, которые переполняют мою сеть?

EDIT : при поиске в сети выяснилось, что на этот раз мой код не сломан.Вместо этого JVM есть.Данные, которые вы получаете из InterfaceAddress.getBroadcast(), являются несовместимыми, по крайней мере, в Windows 7. См., Например, this и this : решение, по-видимому, устанавливает системное свойство Java, чтобы сделать егоЯ предпочитаю IPv4, а не IPv6, но у меня это не работает.Даже при предложенном обходном пути я получаю разные результаты при каждом запуске , и поскольку широковещательный адрес, который я получаю, является, по-видимому, случайным, я подозреваю, что мне даны данные, взятые из неопределенных областей памяти состояний.Серьезно, серьезно ...

Интерфейсная реализация интерфейса не работает .Теперь у меня большая проблема, потому что я не знаю, как разработать это сетевое приложение.Многоадресная IP-рассылка широко не поддерживается.Я просто хочу передать какую-то ерунду на правильный широковещательный адрес UDP без того, чтобы пользователь записывал его в текстовое поле.

1 Ответ

0 голосов
/ 24 ноября 2011

Вам необходимо получить сетевой IP-адрес, пометить и использовать его для трансляции.Это простая часть.Затем вам нужно собрать все ответы, зная, что некоторые серверы, возможно, не получили пакеты UDP, а некоторые из ответов могли быть потеряны.Вы должны учитывать тот факт, что UDP спроектирован как ненадежный.

Я бы проанализировал ipconfig / all напрямую, чтобы получить IP и подмаску.Даже ipconfig имеет только маску для IPv4

...