Мне нужно транслировать пакет 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 без того, чтобы пользователь записывал его в текстовое поле.