android - 无法创建数据报套接字(操作系统错误 : Permission denied, errno = 13

标签 android ios flutter android-manifest android-permissions

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

未处理的异常:SocketException:无法创建数据报套接字(操作系统错误:权限被拒绝,errno = 13),地址 = 0.0.0.0,端口 = 9

我的 Android list 中有这些权限,但我仍然无法让它停止错误:

<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();
    });
  }
}

最佳答案

要使用临时端口(如在 java 中,如注释中所述)只需传递 0 进行绑定(bind)。

    return RawDatagramSocket.bind(InternetAddress.anyIPv4, 0)

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

引用:

If port has the value 0 an ephemeral port will be chosen by the system. The actual port used can be retrieved using the port getter.

关于android - 无法创建数据报套接字(操作系统错误 : Permission denied, errno = 13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343158/

相关文章:

java - inflater.inflate 在 Adapter getview 方法中给出空指针。为什么?

java - 如何更改 Activity 中的操作栏和状态栏颜色?

iOS indexPathsForSelectedRows 和初始选择

ios - 如何在后台捕获由推送通知触发的 iOS 位置?

flutter - 添加新元素以循环映射

使用 Kotlin 的 Android Dagger 2,奇怪的错误

java - 有没有一种方法可以直接从另一个类调用类函数而无需在 Java 中使用它的实例?

objective-c - 键 IOS 值的字典检索

android - 我想将平面按钮与其余元素对齐到起点,但是某些属性阻止了它

flutter - 错误 : Signing for "Runner" requires a development team