2017-07-19 12 views
1

1つのマルチキャストグループとポートからパケットをキャプチャしたい。まず、tcpdumpコマンドを使用して、データがキャプチャされるかどうかを確認しました。Java Multicast receiver not working

コマンド -

tcpdump -i <interface name> dst <multicast ip> 

私はこのマルチキャストグループに参加するJavaで一つのプログラムを作成し、コンソール上のデータを印刷します。

レシーバ -

public class MulticastClient { 

    public static void main(String args[]) throws IOException { 
     MulticastSocket socket = new MulticastSocket(<port number here>); 
     //socket.setInterface(InetAddress.getByName("<local interface ip address>")); // This line makes sense or not...don't know 
     socket.joinGroup(InetAddress.getByName("<multicast ip here>")); 

     while (true) { 
      byte ab[] = new byte[583]; 
      DatagramPacket packet = new DatagramPacket(ab, ab.length); 
      socket.receive(packet); 
      System.out.println("Got packet " + Arrays.toString(ab)); 
     } 
    } 
} 

このプログラムは、所与のマルチキャスト・グループとポートからのパケットをキャプチャすることができません。

テストのために、1つのマルチキャストグループとポートでデータを送信する1つのMulticastSockerServerを作成しました。

送信者 -

public class MulticastServer { 

    public static void main(String[] args) throws Exception { 

     final InetAddress group = InetAddress.getByName("<multicast group ip>"); 
     final int port = <port number>; 

     try { 
      MulticastSocket socket = new MulticastSocket(9000); 
      //socket.setInterface(InetAddress.getByName("<local interface ip address>")); 
      socket.joinGroup(group); 

      byte[] bt = new byte[100]; 
      byte index = 0; 
      while (true) { 
       Arrays.fill(bt, (byte) index++); 
       socket.send(new DatagramPacket(bt, 100, group, port)); 
       System.out.println("sent 100 bytes"); 
       Thread.sleep(1 * 1000); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

私は、この2つのプログラムを実行すると、それは私が期待どおりに動作、データを受信機側でキャプチャされます。受信者だけが異なるマルチキャストグループのIPとポートからデータをキャプチャできないのはなぜですか?

任意の提案は充当されます。

+2

tcpdump呼び出し - 基本的には、実際にマルチキャストサーバーに接続できることを確認するためにJavaコードを実行しているシステムで実験しましたか?たとえば、ファイアウォールによってブロックされないようにするには? – GhostCat

+0

@ GhostCat-私は既にファイアウォールの状態についてチェックしていて、現在実行中ではありません。私のJavaの送信者と受信機は正常に動作しますが、サーバからのデータをキャプチャできません。マルチキャストグループipとポート – kit

+0

JavaクライアントはUDPマルチキャストデータグラムだけを表示しますが、tcpdumpコマンドはUDP以外のあらゆる種類のマルチキャストデータグラムを表示します。ローカルネットワークにUDPマルチキャストデータグラムがありますか?別の質問:あなたのホストに複数のインターフェースがありますか? –

答えて

1

私は明確さを得て、私はなぜJavaクライアントがデータを取得していないかを知りました。実際にtcpdumpコマンドがある -

tcpdump -i <interface name> dst <multicast ip> 

このコマンドは、すべてのパケットをキャプチャします(すなわち、どんなにそれがUDPであるかPGM)コマンド(マルチキャストIP)で与えられる宛先アドレスを持っています。

Javaクライアントは、PGMパケットではなくUDPパケットしかキャプチャしません。私のローカルネットワーク上では、PGMパケットだけが利用できるので、tcpdumpコマンドはデータを与えますが、Javaクライアントはデータを受信しません。

あなたはPGMパケットをキャプチャしたい場合、あなたは以下のいずれかを使用する必要があります - 読み/任意の(すなわち、UDPまたはPGM)のパケットをキャプチャする

  1. 使用JnetPcapライブラリ。
  2. Javapgmライブラリを使用してpgmパケットのみをキャプチャします。
  3. dumpcapを使用してパケットをキャプチャし、pcapファイルに格納します。

希望します。