From a7ebf7ad0c90fabc34fffc4634476f4b7e0ac56b Mon Sep 17 00:00:00 2001 From: Bluzume <39113159+KuromeSan@users.noreply.github.com> Date: Tue, 2 Nov 2021 02:15:46 -0400 Subject: [PATCH] fix disconnecting --- .../HorseIsleServer/Server/GameClient.cs | 19 +++++++------------ .../HorseIsleServer/Server/PacketBuilder.cs | 14 +++++--------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/HorseIsleServer/HorseIsleServer/Server/GameClient.cs b/HorseIsleServer/HorseIsleServer/Server/GameClient.cs index 72fbe80..ed773ed 100644 --- a/HorseIsleServer/HorseIsleServer/Server/GameClient.cs +++ b/HorseIsleServer/HorseIsleServer/Server/GameClient.cs @@ -59,7 +59,6 @@ namespace HISP.Server private List currentPacket = new List(); private byte[] workBuffer = new byte[1028]; - private bool dcLock = false; public GameClient(Socket clientSocket) { @@ -81,6 +80,7 @@ namespace HISP.Server e.Completed += receivePackets; e.SetBuffer(workBuffer, 0, workBuffer.Length); ClientSocket.ReceiveAsync(e); + } public static void CreateClient(object sender, SocketAsyncEventArgs e) @@ -97,6 +97,9 @@ namespace HISP.Server // HI1 Packets are terminates by 0x00 so we have to read until we receive that terminator + if (!ClientSocket.Connected) + isDisconnecting = true; + if (e.SocketError == SocketError.Success && !isDisconnecting) { @@ -119,13 +122,8 @@ namespace HISP.Server ClientSocket.ReceiveAsync(e); return; } - else - { - Disconnect(); - } - - while (dcLock) { }; // Refuse to shut down until dcLock is cleared. (prevents TOCTOU issues.) - + + Disconnect(); // Stop Timers if (inactivityTimer != null) @@ -144,12 +142,11 @@ namespace HISP.Server ClientSocket.Close(); ClientSocket.Dispose(); - return; // Stop the task. + return; } private void minuteTimerTick(object state) { - dcLock = true; totalMinutesElapsed++; if (LoggedIn) { @@ -166,7 +163,6 @@ namespace HISP.Server LoggedinUser.FreeMinutes = 0; if (!LoggedinUser.Subscribed && !LoggedinUser.Moderator && !LoggedinUser.Administrator) { - dcLock = false; Kick(Messages.KickReasonNoTime); return; } @@ -311,7 +307,6 @@ namespace HISP.Server if (!isDisconnecting) minuteTimer.Change(oneMinute, oneMinute); - dcLock = false; } private void keepAliveTimerTick(object state) { diff --git a/HorseIsleServer/HorseIsleServer/Server/PacketBuilder.cs b/HorseIsleServer/HorseIsleServer/Server/PacketBuilder.cs index 10d63db..136130e 100644 --- a/HorseIsleServer/HorseIsleServer/Server/PacketBuilder.cs +++ b/HorseIsleServer/HorseIsleServer/Server/PacketBuilder.cs @@ -4,7 +4,6 @@ using System.Globalization; using System.IO; using System.Text; using HISP.Game; -using HISP.Game.Horse; using HISP.Game.SwfModules; namespace HISP.Server @@ -229,15 +228,12 @@ namespace HISP.Server public static byte[] Create2PlayerClose() { - MemoryStream ms = new MemoryStream(); - ms.WriteByte(PACKET_SWFMODULE); - ms.WriteByte(SWFMODULE_2PLAYER_CLOSED); - ms.WriteByte(PACKET_TERMINATOR); + byte[] packet = new byte[3]; + packet[0] = PACKET_SWFMODULE; + packet[1] = SWFMODULE_2PLAYER_CLOSED; + packet[2] = PACKET_TERMINATOR; - ms.Seek(0x00, SeekOrigin.Begin); - byte[] response = ms.ToArray(); - ms.Dispose(); - return response; + return packet; } public static byte[] CreateDressupRoomPeiceMove(int peiceId, double x, double y, bool active) {