2017-02-07 64 views
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我能收到答覆的問題。

+1

如果它在本地主機上工作,則顯然不是代碼問題。這是一種拓撲或路由或電纜問題。 – EJP

+0

@EJP作爲第三方TCP/UDP調試應用程序的PacketSender能夠接收響應,因此代碼必須存在錯誤。無論是那個還是JVM的問題,我都不會說沒有更多的測試。 – Beryllium

+1

「通過交叉連接進行連接」。這是否意味着交叉*電纜*?這是一個物理層問題,在現代設備中幾乎總是通過網絡接口自動且透明地處理。如果你能夠在兩個系統之間進行通信,很難看出這可能是這個問題的任何部分。我會使用wireshark來確定兩個系統之間實際發送的數據包。 –

回答

1

我對你的代碼看起來有什麼不對,就是你如何將接收和發送套接字綁定到同一個端口。沒有setReuseAddress()其中一個綁定應該失敗。要解決這個問題,只需將第一段代碼中的第一行更改爲使用任何空閒端口即可:

final DatagramSocket socket = new DatagramSocket();