java.net.BindException : bind failed: EACCES (Permission denied) when trying to create DatagramSocket for UDP connection

标签 java android udp android-permissions

我正在尝试将 UDP 数据包发送到 android studio 中的远程主机。但出现了这个错误:

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$000(PacketSender.java:20)
    at com.genean.dronecontroller.PacketSender$1.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$000(PacketSender.java:20) 
    at com.genean.dronecontroller.PacketSender$1.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 设置任意端口号。

关于java.net.BindException : bind failed: EACCES (Permission denied) when trying to create DatagramSocket for UDP connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56218272/

相关文章:

java - "Class is a collection of objects".是对还是错的定义?

java - 使用 Apache POI 我可以阻止用户复制格式吗?

java - Hibernate 锁定项目的数组列表

android - 在 flutter 中使用 Dart 从值通知器中删除监听器

android - 意外的 anchor 值,在 Compose 应用程序发布构建中预期为负 anchor

c# - 仅从特定适配器(例如 192.168.101.1)发送 UDP 广播(255.255.255.255);在 Windows 上

c - 为什么 UNIX 域数据报套接字的 recvfrom() 返回无效参数?

java - 在文件基础服务上执行 junit 时出现 IOException

android - 如何在 Android 通话期间监听音频路由的变化

udp - 如何使用树莓派控制WIFI插头GWF-S171