2011-12-21 18 views
2

Mac OS X(Lion、10.7.2、Javaバージョン "1.6.0_29")でJavaアプリケーションを操作しているときに、マルチキャストUDPデータグラムを送信しようとしています。パケットは1つのNICでのみ送信されており、どのパケットを制御するのかわかりません。間違ったNIC(Java、Mac OS X)でUDPマルチキャストを送信

次のコード例は、私が何をしようとしています何を示しています

public class MCast { 
    public static void main(String[] args) throws IOException { 
     InetAddress multicastAddr = InetAddress.getByName("224.0.0.1"); 
     int port = 58680; 
     byte[] data = "test".getBytes(); 

     DatagramPacket packet = new DatagramPacket(data, data.length, multicastAddr, port); 

     MulticastSocket socket = new MulticastSocket(); 
     socket.joinGroup(multicastAddr); 
     socket.setNetworkInterface(NetworkInterface.getByName("en0")); 

     socket.send(packet); 
     System.out.println("Packet sent."); 
    } 
} 

このコードを実行する一方で、私はすべてのトラフィックがen0の上外出検討するWiresharkのを使用しています。指定されたポートではパケットは送信されません。しかしながら、前記パケットは、en1のトレースに現れる。

en1を無効にすると、パケットは適切にen0に送信されます。

私はここに迷っています。誰が何が起こっているのか分かっていますか?

答えて

0

アドレスをMulticastSocketのコンストラクタに渡すことができます。あなたはそれをあなたが望むアドレスにバインドするために使うことができます。

+0

通常、それは仕事をするでしょう。残念ながら、私が書いているサービスの性質上、別のアプリケーションで既に使用されているポート上にあることが必要です。バインドしようとすると、 'BindException'がスローされます。しかし、試してくれてありがとう。編集:または私は私の脳を使用して、0のポートとバインドすることを伝えることができますありがとう! – Terrana

6

マルチキャスト出力インターフェイスは、グループ参加時に現在のルーティングテーブルによって決定されます。ほとんどの場合、デフォルトルートを意味するので、en0です。あなたが唯一の送信とされていない場合、グループは

socket.setNetworkInterface(NetworkInterface.getByName("en0")); 
socket.joinGroup(multicastAddr); 

また、あなたが参加する必要があります(またbind())していない:明示的なルートを追加するに役立つだろう、あなただけであるためにあなたのコード内の2行を逆にすることができますそのマルチキャストトラフィックをリッスンします。代わりに、グループアドレスにconnect()

関連する問題