2

udp パケットをブロードキャストしようとすると、問題が発生します。

08-22 16:36:13.359 E/UDPTester.UDPEndpoint( 3657): IOException : Permission denied
08-22 16:36:13.359 W/System.err( 3657): java.net.SocketException: Permission denied
08-22 16:36:13.369 W/System.err( 3657):     at org.apache.harmony.luni.platform.OSNetworkSystem.send(Native Method)
08-22 16:36:13.369 W/System.err( 3657):     at dalvik.system.BlockGuard$WrappedNetworkSystem.send(BlockGuard.java:308)
08-22 16:36:13.369 W/System.err( 3657):     at org.apache.harmony.nio.internal.DatagramChannelImpl.send(DatagramChannelImpl.java:359)
08-22 16:36:13.369 W/System.err( 3657):     at zexing.udptester.UDPEndpoint.broadcast(UDPEndpoint.java:151)
08-22 16:36:13.369 W/System.err( 3657):     at zexing.udptester.MainActivity.onClickBroadcast(MainActivity.java:162)
08-22 16:36:13.369 W/System.err( 3657):     at java.lang.reflect.Method.invokeNative(Native Method)
08-22 16:36:13.369 W/System.err( 3657):     at java.lang.reflect.Method.invoke(Method.java:507)
08-22 16:36:13.369 W/System.err( 3657):     at android.view.View$1.onClick(View.java:2155)
08-22 16:36:13.369 W/System.err( 3657):     at android.view.View.performClick(View.java:2501)
08-22 16:36:13.369 W/System.err( 3657):     at android.view.View$PerformClick.run(View.java:9107)
08-22 16:36:13.369 W/System.err( 3657):     at android.os.Handler.handleCallback(Handler.java:587)
08-22 16:36:13.369 W/System.err( 3657):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 16:36:13.369 W/System.err( 3657):     at android.os.Looper.loop(Looper.java:130)
08-22 16:36:13.369 W/System.err( 3657):     at android.app.ActivityThread.main(ActivityThread.java:3835)
08-22 16:36:13.369 W/System.err( 3657):     at java.lang.reflect.Method.invokeNative(Native Method)
08-22 16:36:13.369 W/System.err( 3657):     at java.lang.reflect.Method.invoke(Method.java:507)
08-22 16:36:13.369 W/System.err( 3657):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
08-22 16:36:13.369 W/System.err( 3657):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
08-22 16:36:13.369 W/System.err( 3657):     at dalvik.system.NativeStart.main(Native Method)

AndroidManifest.xml では、これらのアクセス許可を既に追加しています。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

また、ブロードキャストの前にマルチキャストロックを取得します

// マルチキャスト ロックを作成 @ Activity.onCreate

mcastLock =  wifiManager.createMulticastLock("zexing.udptester.Multicast");

// ブロードキャスト中にマルチキャスト ロックを取得する

mcastLock.acquire();
if (mcastLock.isHeld()) {
    Log.i(TAG, "held multicast lock");
}
udpEndpoint.broadcast(msg, port);
Log.v(TAG, "broadcast " + msg + " to port : " + port);
Log.d(TAG, "Release wifi Multicast lock to enable wifi UDP broadcast");
mcastLock.release();

// UdpEndpoint.broadcast

public void broadcast(String msg, int port) {
    try {
        if (broadcastChannel == null) {
            Log.v(TAG, "opening write DatagramChannel");
            broadcastChannel = DatagramChannel.open();
            Log.v(TAG, "config write channel to non-blocking");
            broadcastChannel.configureBlocking(false);
            Log.v(TAG, "reuse address");
            broadcastChannel.socket().setReuseAddress(true);
            Log.v(TAG, "set broadcast to true");
            broadcastChannel.socket().setReuseAddress(true);
            Log.v(TAG, "register broadcast Channel");
            broadcastChannel.register(selector, SelectionKey.OP_READ);
            Log.v(TAG, "register broadcast channel successfully");
        }
        if (msg.length() == 0) {
            Log.w(TAG, "message to broadcast is null, skip sending");
        }
        SocketAddress addr = new InetSocketAddress(InetAddress.getByName("255.255.255.255"), port);
        Log.v(TAG, "allocate " + msg.length() + " bytes. msg.getBytes().length = " + msg.getBytes().length);
        ByteBuffer bb = ByteBuffer.allocate(msg.length());
        bb.clear();
        bb.put(msg.getBytes());
        bb.flip();
        Log.v(TAG, "write channel broadcast " + msg + " to " + addr);
        int bytes = broadcastChannel.send(bb, addr);
        Log.v(TAG, "broadcast " + bytes + " bytes to " + addr);
    } catch (UnknownHostException uhe) {
        Log.e(TAG, "UnknownHostException : " + uhe.getMessage());
    } catch (IOException e) {
        Log.e(TAG, "IOException : " + e.getMessage());
        e.printStackTrace();
    }
}
4

1 に答える 1

0

サブネットのブロードキャスト アドレスの例: 255.255 ではなく 192.168.1.255 にブロードキャストを送信してみてください。さらに、ポートが 1024 よりもメジャーであるか、ポート 0 であることを確認してください。システムがいずれかを選択します。

于 2015-07-11T16:29:51.467 に答える