From d63f2cfb67fa6a0849f5c0d96c891a9a29f15deb Mon Sep 17 00:00:00 2001 From: Albert Vaca Cintora Date: Sun, 11 Jun 2023 19:15:00 +0200 Subject: [PATCH] Set socket options before binding to a port and not after By passing a port the implementation of DatagramSocket already binds to it, making it fail if the port was already in use even if we did setReuseAddress because that happened after binding. --- .../Backends/LanBackend/LanLinkProvider.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java index 9f59b9be..ef507004 100644 --- a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java +++ b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java @@ -53,6 +53,7 @@ import kotlin.text.Charsets; */ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDisconnectedCallback { + private final static int UDP_PORT = 1716; private final static int MIN_PORT = 1716; private final static int MAX_PORT = 1764; final static int PAYLOAD_TRANSFER_MIN_PORT = 1739; @@ -279,14 +280,21 @@ public class LanLinkProvider extends BaseLinkProvider implements LanLink.LinkDis private void setupUdpListener() { try { - udpServer = new DatagramSocket(MIN_PORT); + udpServer = new DatagramSocket(null); udpServer.setReuseAddress(true); udpServer.setBroadcast(true); } catch (SocketException e) { Log.e("LanLinkProvider", "Error creating udp server", e); throw new RuntimeException(e); } + try { + udpServer.bind(new InetSocketAddress(UDP_PORT)); + } catch (SocketException e) { + // We ignore this exception and continue without being able to receive broadcasts instead of crashing the app. + Log.e("LanLinkProvider", "Error binding udp server. We can send udp broadcasts but not receive them", e); + } ThreadHelper.execute(() -> { + Log.i("UdpListener", "Starting UDP listener"); while (listening) { final int bufferSize = 1024 * 512; byte[] data = new byte[bufferSize];