1
我試圖通過所有NetworkInterfaces
廣播UDP數據包並接收答覆。雖然我能夠接收來自本地網絡的響應,但通過交叉連接連接的設備無法收到回覆。通過交叉連接進行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作爲第三方TCP/UDP調試應用程序的PacketSender能夠接收響應,因此代碼必須存在錯誤。無論是那個還是JVM的問題,我都不會說沒有更多的測試。 – Beryllium
「通過交叉連接進行連接」。這是否意味着交叉*電纜*?這是一個物理層問題,在現代設備中幾乎總是通過網絡接口自動且透明地處理。如果你能夠在兩個系統之間進行通信,很難看出這可能是這個問題的任何部分。我會使用wireshark來確定兩個系統之間實際發送的數據包。 –