Я пытаюсь передать UDP-пакет по всем NetworkInterfaces
и получать ответы. Хотя я могу получать ответы от локальной сети, устройство, подключенное через кроссоверное соединение, не может получить ответ.UDP-трансляция через кроссоверное соединение
Это код, чтобы получить все интерфейсы, которые действительно возвращаются соединение кроссовера NetworkInterface
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while(interfaces.hasMoreElements()){
List<InterfaceAddress> iAddrs = interfaces.nextElement().getInterfaceAddresses();
iAddrs.forEach(addr -> {
if(addr.getBroadcast() != null){
System.out.println(addr.getBroadcast());
sendUDP(addr.getBroadcast());
}
});
}
Затем я использую этот раздел кода для отправки пакета UDP и слушать ответы.
final DatagramSocket socket = new DatagramSocket(9800);
socket.setBroadcast(true);
socket.setSoTimeout(5000);
final byte[] data = "A-UDP-BROADCAST".getBytes();
byte[] buffer = new byte[1024];
socket.send(new DatagramPacket(data, data.length, addr, 9800));
while (true) {
try {
final DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData()));
} catch (SocketTimeoutException e) {
System.out.println("Timed out.");
return;
}
buffer = new byte[1024];
}
Это должен быть проблемой в этом разделе коды, как, когда я посылаю пакет с внешней программой, такими как PacketSender я в состоянии получить ответ.
Если он работает на локальном хосте, это явно * не проблема с кодом. Это проблема с топологией или маршрутизацией или кабелем. – EJP
@EJP PacketSender, являющийся сторонним приложением для отладки TCP/UDP, может получать ответы, поэтому должна быть ошибка в коде. Это либо проблема, либо проблема JVM, и я не собираюсь говорить об этом без большого тестирования. – Beryllium
«Подключено через кроссоверное соединение». Означает ли это перекрестный * кабель *? Это проблема физического уровня, и в современном оборудовании почти всегда обрабатываются автоматически и прозрачно сетевыми интерфейсами. Если вы можете вообще общаться между двумя системами, трудно понять, как это может быть частью этой проблемы. Я бы использовал wirehark для определения того, какие пакеты фактически отправляются между двумя системами. –