Failed to create datagram socket (OS Error: Permission denied, errno = 13
Failed to create datagram socket (OS Error: Permission denied, errno = 13
我正在使用 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();
});
}
}
要使用临时端口(如 java,如评论中所述)只需将 0 传递给绑定。
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.
我正在使用 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();
});
}
}
要使用临时端口(如 java,如评论中所述)只需将 0 传递给绑定。
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.