2011-02-27 10 views
2

私のMacでjavaからブロードキャストを送信しようとしています。これはうまくいくはずですが、SecurityExceptionが発生しています。私は、SecurityManagerがインストールされていないことを確認し、sudoを使用してクラスを実行しようとしました。SecurityException OS XでJavaからブロードキャストを送信しています

コード:

public static void main(String[] args) throws Exception{ 
    SocketAddress sockAddr = new InetSocketAddress("192.168.0.255", 
      4000); 
    ByteBuffer bb = ByteBuffer.allocate(10); 
    bb.put(new Byte("1")); 
    DatagramChannel channel = DatagramChannel.open(); 
    channel.send(bb, sockAddr); 
} 

例外:

Exception in thread "main" java.net.SocketException: Permission denied 
    at sun.nio.ch.DatagramChannelImpl.send0(Native Method) 
    at sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:301) 
    at sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:281) 
    at sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:250) 
    at Test.main(Test.java:15) 
SocketException
+0

DatagramChannelではなくDatagramSocketを使用していることに驚いています。このチャネルはソケットの基本実装ですが、ブロードキャストを実行するためにすべての設定を行うわけではありません。 – Petesh

答えて

3

少しグーグルでやった、あなたはのDatagramChannelが、それはコードを使用して放送チャンネルだと使用しているソケット伝える必要があります:

channel.socket().setBroadcast(true); 

を、私はそれはあなたが放送ソケットオプションを設定する必要があるだけだと思います下にあるO/Sソケットである「チャネル」上にある。明らかに、これはjava7が出てからチャンネルレベルから実行可能ですが、現在はDatagramSocketにアクセスしてパラメータを設定する必要があります。

+0

素晴らしい!それがトリックでした。どうもありがとうございました。 – ddc

0

ないSecurityException(又はAccessControlException)です。 OSがあなたのプロセスにそのデータグラムを送信することを許可していないようです。

+0

おっと - そうです。私はちょうど理由を理解することができません... – ddc

関連する問題