2012-02-10 6 views
1

ウェイクオンに拒否された権限の私がWake on LANのを実装するため、このコードは書いている:にjava.io.IOException:蘭

InetAddress address = InetAddress.getByAddress(
     new byte[]{(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff}); 
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 7); 
socket.send(packet); 

をしかし、私はこの取得:

java.io.IOException: Permission denied 
    at gnu.java.nio.VMChannel.send(Native Method) 
    at gnu.java.nio.VMChannel.send(VMChannel.java:308) 
    at gnu.java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:261) 
    at java.net.DatagramSocket.send(DatagramSocket.java:659) 
    at com.MyApp.wakeonlan(MyApp.java:685) 

を問題はそうです他のアドレスに変更するとこのエラーは発生しないためです。どうすればそれを使えますか?私はJamVMとGNU Classpathを使ってlinux busyboxを使っています。

+0

rootとして実行するとうまくいくと思いますか? – NPE

+0

私はrootですが、それでも動作しません。 – michelemarcon

+0

Javaセキュリティ/権限/ポリシーはありませんか?特定のアドレスによって実際に起動された場合は、それをブロックする 'java.net.SocketPermission'になる可能性があります –

答えて

1

それは後半だが、ここでクラスパス150のためのパッチです:

diff -aur a/native/jni/java-nio/gnu_java_nio_VMChannel.c b/native/jni/java-nio/gnu_java_nio_VMChannel.c 
--- a/native/jni/java-nio/gnu_java_nio_VMChannel.c 2007-12-28 18:49:56.000000000 +0100 
+++ b/native/jni/java-nio/gnu_java_nio_VMChannel.c 2012-08-14 08:49:38.000000000 +0200 
@@ -868,6 +868,17 @@ 

    elems = (*env)->GetByteArrayElements (env, addr, NULL); 

+ int n = 1; 
+ 
+ if (*((uint32_t *) elems) == 0xFFFFFFFF) 
+ { 
+ if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) 
+ { 
+  JCL_ThrowException (env, IO_EXCEPTION, "unable to set broadcast option"); 
+  return -1; 
+ } 
+ } 
+ 
    sockaddr.sin_family = AF_INET; 
    sockaddr.sin_addr.s_addr = *((uint32_t *) elems); 
    sockaddr.sin_port = htons (port); 

これは、問題を解決します。

+0

私は外部プログラムを呼び出すことによって問題を解決しましたが、あなたの努力に感謝します! – michelemarcon

関連する問題