Не удалось создать сокет дейтаграммы (ошибка ОС: отказано в разрешении, errno = 13 - PullRequest
4 голосов
/ 21 февраля 2020

Я использую флаттер и использую 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();
    });
  }
}

1 Ответ

2 голосов
/ 02 марта 2020

Чтобы использовать эфемерный порт (как в java, как упомянуто в комментариях), просто передайте 0 для привязки.

    return RawDatagramSocket.bind(InternetAddress.anyIPv4, 0)

Это не задокументировано, вот проблема: https://github.com/dart-lang/sdk/issues/35147

Цитата:

Если порт имеет значение 0, эфемерный порт будет выбран системой. Фактический используемый порт может быть получен с помощью средства получения порта.

...