From 7b941e75f37fa20d6ea7b0607fa23f618f01cc8d Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Sun, 8 Feb 2026 21:26:44 +0100 Subject: [PATCH] Bug fixed --- pom.xml | 2 +- .../system/server/ConnectedClient.java | 1 - .../network/system/server/NetworkServer.java | 30 +++++++++++-------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index 3f59c2f..4214e6a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.unlegitdqrk unlegitlibrary - 1.8.0 + 1.8.1 https://unlegitdqrk.dev/ Just a big library diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/ConnectedClient.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/ConnectedClient.java index 7660472..10870ae 100644 --- a/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/ConnectedClient.java +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/ConnectedClient.java @@ -128,7 +128,6 @@ public class ConnectedClient { try { if (tcpSocket != null) tcpSocket.close(); } catch (IOException ignored) {} try { if (inputStream != null) inputStream.close(); } catch (IOException ignored) {} try { if (outputStream != null) outputStream.close(); } catch (IOException ignored) {} - try { if (udpChannel != null) udpChannel.close(); } catch (IOException ignored) {} tcpSocket = null; udpChannel = null; diff --git a/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/NetworkServer.java b/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/NetworkServer.java index 47db799..3da5999 100644 --- a/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/NetworkServer.java +++ b/src/main/java/dev/unlegitdqrk/unlegitlibrary/network/system/server/NetworkServer.java @@ -209,39 +209,45 @@ public class NetworkServer { private void udpReceiveLoop() { ByteBuffer buffer = ByteBuffer.allocate(65536); + while (!Thread.currentThread().isInterrupted()) { try { buffer.clear(); SocketAddress sender = udpChannel.receive(buffer); if (sender == null) continue; + buffer.flip(); - if (buffer.remaining() < 13) continue; // 12-byte IV + at least 1 byte payload + if (buffer.remaining() < 13) continue; UUID mappedUuid = clientUdpAddresses.get(sender); if (mappedUuid != null) { ConnectedClient mappedClient = getClientByUuid(mappedUuid); - if (mappedClient != null) { - if (tryHandleUdpPacket(mappedClient, sender, buffer.asReadOnlyBuffer())) { - continue; - } + if (mappedClient != null && tryHandleUdpPacket(mappedClient, sender, buffer.asReadOnlyBuffer())) { + continue; } } - // Fallback: try all clients if mapping missing or decrypt failed (e.g., NAT rebinding) List snapshot; synchronized (connectedClients) { snapshot = new ArrayList<>(connectedClients); } for (ConnectedClient client : snapshot) { - if (tryHandleUdpPacket(client, sender, buffer.asReadOnlyBuffer())) { - break; - } + if (tryHandleUdpPacket(client, sender, buffer.asReadOnlyBuffer())) break; } + } catch (java.nio.channels.ClosedChannelException e) { + // Expected on shutdown / close from another thread. + break; } catch (IOException e) { - if (tcpSocket != null) { - try { tcpSocket.close(); } catch (IOException ignored) {} + // Not fatal for TCP. Keep UDP loop alive unless channel is actually closed. + if (udpChannel == null || !udpChannel.isOpen() || Thread.currentThread().isInterrupted()) { + break; } - if (Thread.currentThread().isInterrupted()) { + e.printStackTrace(); + + try { + Thread.sleep(50); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); break; } }