java.net.BindException:绑定失败:尝试为 UDP 连接创建 DatagramSocket 时出现 EACCES(权限被拒绝)
java.net.BindException: bind failed: EACCES (Permission denied) when trying to create DatagramSocket for UDP connection
我正在尝试将 UDP 数据包发送到 android 工作室中的远程主机。但是出现了这个错误:
java.net.BindException: bind failed: EACCES (Permission denied)
at libcore.io.IoBridge.bind(IoBridge.java:103)
at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:110)
at java.net.DatagramSocket.bind(DatagramSocket.java:412)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at java.net.DatagramSocket.<init>(DatagramSocket.java:319)
at com.genean.dronecontroller.PacketSender.sendConnectionPacket(PacketSender.java:55)
at com.genean.dronecontroller.PacketSender.access[=11=]0(PacketSender.java:20)
at com.genean.dronecontroller.PacketSender.run(PacketSender.java:45)
at java.lang.Thread.run(Thread.java:784)
Caused by: android.system.ErrnoException: bind failed: EACCES (Permission denied)
at libcore.io.Linux.bind(Native Method)
at libcore.io.ForwardingOs.bind(ForwardingOs.java:60)
at libcore.io.IoBridge.bind(IoBridge.java:99)
at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:110)
at java.net.DatagramSocket.bind(DatagramSocket.java:412)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at java.net.DatagramSocket.<init>(DatagramSocket.java:319)
at com.genean.dronecontroller.PacketSender.sendConnectionPacket(PacketSender.java:55)
at com.genean.dronecontroller.PacketSender.access[=11=]0(PacketSender.java:20)
at com.genean.dronecontroller.PacketSender.run(PacketSender.java:45)
at java.lang.Thread.run(Thread.java:784)
这是 PacketSender 的第 55 行:
socket = new DatagramSocket(HOST_PORT);
我试过添加 android.permission.INTERNET 甚至用
检查了它
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
Toast toast = Toast.makeText(activity.getApplicationContext(),
activity.getString(R.string.no_internet_perms), Toast.LENGTH_LONG);
toast.show();
}
然而它仍然给我一个权限错误。
编辑:怀疑它可能是我使用的端口 333。
显然,我意识到尽管有android.permission.INTERNET,但不可能使用特定的本地端口来建立套接字。您遇到权限错误或端口已被其他应用程序占用。因此,我通过在没有任何参数的情况下启动我的 DatagramSocket 来修复它,以允许 Android 设置任意端口号。
我正在尝试将 UDP 数据包发送到 android 工作室中的远程主机。但是出现了这个错误:
java.net.BindException: bind failed: EACCES (Permission denied)
at libcore.io.IoBridge.bind(IoBridge.java:103)
at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:110)
at java.net.DatagramSocket.bind(DatagramSocket.java:412)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at java.net.DatagramSocket.<init>(DatagramSocket.java:319)
at com.genean.dronecontroller.PacketSender.sendConnectionPacket(PacketSender.java:55)
at com.genean.dronecontroller.PacketSender.access[=11=]0(PacketSender.java:20)
at com.genean.dronecontroller.PacketSender.run(PacketSender.java:45)
at java.lang.Thread.run(Thread.java:784)
Caused by: android.system.ErrnoException: bind failed: EACCES (Permission denied)
at libcore.io.Linux.bind(Native Method)
at libcore.io.ForwardingOs.bind(ForwardingOs.java:60)
at libcore.io.IoBridge.bind(IoBridge.java:99)
at java.net.PlainDatagramSocketImpl.bind0(PlainDatagramSocketImpl.java:104)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:110)
at java.net.DatagramSocket.bind(DatagramSocket.java:412)
at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
at java.net.DatagramSocket.<init>(DatagramSocket.java:319)
at com.genean.dronecontroller.PacketSender.sendConnectionPacket(PacketSender.java:55)
at com.genean.dronecontroller.PacketSender.access[=11=]0(PacketSender.java:20)
at com.genean.dronecontroller.PacketSender.run(PacketSender.java:45)
at java.lang.Thread.run(Thread.java:784)
这是 PacketSender 的第 55 行:
socket = new DatagramSocket(HOST_PORT);
我试过添加 android.permission.INTERNET 甚至用
检查了它if (ContextCompat.checkSelfPermission(activity, Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
Toast toast = Toast.makeText(activity.getApplicationContext(),
activity.getString(R.string.no_internet_perms), Toast.LENGTH_LONG);
toast.show();
}
然而它仍然给我一个权限错误。
编辑:怀疑它可能是我使用的端口 333。
显然,我意识到尽管有android.permission.INTERNET,但不可能使用特定的本地端口来建立套接字。您遇到权限错误或端口已被其他应用程序占用。因此,我通过在没有任何参数的情况下启动我的 DatagramSocket 来修复它,以允许 Android 设置任意端口号。