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}");
+ }
}
}
}