java.net.BindException: связать не удалось: EACCES (В доступе отказано) при попытке создать DatagramSocket для UDP-соединения - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь отправить 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) 

Вот строка 55 PacketSender:

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.

1 Ответ

0 голосов
/ 20 мая 2019

Очевидно, я понял, что невозможно использовать определенный локальный порт для установки сокета, несмотря на наличие android.permission.INTERNET. Либо вы получили ошибку разрешения, либо порт был занят другим приложением. Поэтому я исправил это, запустив DatagramSocket без каких-либо параметров, чтобы Android мог вместо этого установить произвольный номер порта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...