无法创建数据报套接字(操作系统错误:权限被拒绝,errno = 13

问题描述 投票:1回答:1

我正在使用flutter,并在dart中利用RawDatagramSocket来发送WOL数据包。我的代码在IOS上运行良好,但在android模拟器中,我一直收到此错误

Unhandled Exception: SocketException: Failed to create datagram socket (OS Error: Permission denied, errno = 13), address = 0.0.0.0, port = 9

我在Android清单中具有这些权限,但仍然无法阻止它停止错误:

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

用法示例如下所示:

class WakeOnLanService {
  Future wake(InternetAddress ipAddress, MacAddress macAddress, int port) {
    return RawDatagramSocket.bind(InternetAddress.anyIPv4, port)
        .then((RawDatagramSocket udpSocket) {
      udpSocket.broadcastEnabled = true;

      List<int> macBytes = macAddress.bytes;
      List<int> packet = new List<int>(17 * 6);
      for (int i = 0; i < 6; i++) packet[i] = 0xFF;
      for (int i = 1; i <= 16; i++)
        for (int j = 0; j < 6; j++) packet[i * 6 + j] = macBytes[j];

      udpSocket.send(packet, ipAddress, port);
      udpSocket.close();
    });
  }
}
android ios flutter android-manifest android-permissions
1个回答
0
投票

要使用临时端口(如注释中提到的在Java中一样,只需将0绑定即可。

    return RawDatagramSocket.bind(InternetAddress.anyIPv4, 0)

未记录,这是一个问题:https://github.com/dart-lang/sdk/issues/35147

报价:

如果端口的值为0,系统将选择一个临时端口。可以使用端口获取器来检索使用的实际端口。

© www.soinside.com 2019 - 2024. All rights reserved.