2017-02-07 16 views
1

すべてNetworkInterfacesでUDPパケットをブロードキャストしようとしています。私はローカルネットワークからの応答を受け取ることができますが、クロスオーバ接続で接続されたデバイスは応答を受信できません。クロスオーバー接続による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()); 
       } 
      }); 
     } 

を返さないすべてのインターフェイスを取得するためのコードです。

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

"クロスオーバー接続で接続"。これはクロスオーバー*ケーブル*を意味しますか?これは物理層の問題であり、現代の機器では、ほとんどの場合、ネットワークインターフェイスによって自動的かつ透過的に処理されます。 2つのシステム間でまったく通信できない場合、どのようにしてこの問題の一部になるのかを確認することは困難です。 wiresharkを使って、2つのシステム間で実際にどのパケットが送信されているかを判断します。 –

答えて

1

あなたのコードについて、私は受信ソケットと送信ソケットの両方を同じポートにバインドする方法が間違っています。 setReuseAddress()がなければ、バインドの1つが失敗するはずです。それを修正するには、単に任意の空きポートを使用するようにコードの2番目の部分の最初の行を変更:

final DatagramSocket socket = new DatagramSocket(); 
関連する問題