From f3cf34970b5d4645cd02229b4e74e8fa361f4d9b Mon Sep 17 00:00:00 2001 From: Extremelyd1 <10898310+Extremelyd1@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:46:26 +0100 Subject: [PATCH] Split packet sending for client update manager to different thread --- HKMP/Networking/Client/NetClient.cs | 20 ++++++++++++++++---- HKMP/Networking/Server/DtlsServer.cs | 14 ++++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/HKMP/Networking/Client/NetClient.cs b/HKMP/Networking/Client/NetClient.cs index c62ff2f..6bb7907 100644 --- a/HKMP/Networking/Client/NetClient.cs +++ b/HKMP/Networking/Client/NetClient.cs @@ -81,6 +81,7 @@ internal class NetClient : INetClient { public NetClient(PacketManager packetManager) { _packetManager = packetManager; + _updateTaskTokenSource = new CancellationTokenSource(); _dtlsClient = new DtlsClient(); _dtlsClient.DataReceivedEvent += OnReceiveData; @@ -135,9 +136,6 @@ private void OnConnectFailed(ConnectFailedResult result) { /// /// A list of raw received packets. private void OnReceiveData(byte[] buffer, int length) { - // TODO: check if this is the correct place to make this call - UpdateManager.ProcessUpdate(); - var packets = PacketManager.HandleReceivedData(buffer, length, ref _leftoverData); foreach (var packet in packets) { @@ -238,6 +236,20 @@ List addonData UpdateManager = new ClientUpdateManager(_dtlsClient.DtlsTransport); // During the connection process we register the connection failed callback if we time out UpdateManager.OnTimeout += OnConnectTimedOut; + + new Thread(() => { + var cancellationToken = _updateTaskTokenSource.Token; + + while (!cancellationToken.IsCancellationRequested) { + UpdateManager.ProcessUpdate(); + + // TODO: figure out a good way to get rid of the sleep here + // some way to signal when clients should be updated again would suffice + // also see NetServer#StartClientUpdates + Thread.Sleep(5); + } + }).Start(); + UpdateManager.StartUpdates(); UpdateManager.SetLoginRequestData(username, authKey, addonData); @@ -255,7 +267,7 @@ public void Disconnect() { IsConnected = false; // Request cancellation for the update task - _updateTaskTokenSource.Cancel(); + _updateTaskTokenSource?.Cancel(); // Clear all client addon packet handlers, because their IDs become invalid _packetManager.ClearClientAddonPacketHandlers(); diff --git a/HKMP/Networking/Server/DtlsServer.cs b/HKMP/Networking/Server/DtlsServer.cs index b71c328..84b37bc 100644 --- a/HKMP/Networking/Server/DtlsServer.cs +++ b/HKMP/Networking/Server/DtlsServer.cs @@ -85,12 +85,13 @@ ref endPoint ServerDatagramTransport serverDatagramTransport; if (!_dtlsClients.TryGetValue(ipEndPoint, out var dtlsServerClient)) { - Logger.Debug("Received data on server socket from unknown IP"); + Logger.Debug($"Received data on server socket from unknown IP ({ipEndPoint}), length: {numReceived}"); serverDatagramTransport = _currentDatagramTransport; // Set the IP endpoint of the datagram transport instance so it can send data to the correct IP serverDatagramTransport.IPEndPoint = ipEndPoint; } else { + Logger.Debug($"Received data on server socket from existing client ({ipEndPoint}), length: {numReceived}"); serverDatagramTransport = dtlsServerClient.DatagramTransport; } @@ -164,8 +165,17 @@ private void ClientReceiveLoop(CancellationToken cancellationToken, DtlsServerCl var buffer = new byte[dtlsTransport.GetReceiveLimit()]; var numReceived = dtlsTransport.Receive(buffer, 0, dtlsTransport.GetReceiveLimit(), 5); + if (numReceived <= 0) { + continue; + } - DataReceivedEvent?.Invoke(dtlsServerClient, buffer, numReceived); + Logger.Debug($"DtlsServerClient ({dtlsServerClient.EndPoint}) received {numReceived} bytes of data, invoking event"); + + try { + DataReceivedEvent?.Invoke(dtlsServerClient, buffer, numReceived); + } catch (Exception e) { + Logger.Error($"Error occurred while invoking DataReceivedEvent:\n{e}"); + } } } }