From 14ccff36e913db0c9f18f0c0403f6b3d074115fd Mon Sep 17 00:00:00 2001 From: xeon Date: Tue, 30 Jan 2024 19:37:13 +0300 Subject: [PATCH] Fix networking bug in Gateserver --- .../Session/NetworkSession.cs | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/RPG.Services.Gateserver/Session/NetworkSession.cs b/RPG.Services.Gateserver/Session/NetworkSession.cs index 7e263eb..2e0fe89 100644 --- a/RPG.Services.Gateserver/Session/NetworkSession.cs +++ b/RPG.Services.Gateserver/Session/NetworkSession.cs @@ -37,25 +37,35 @@ internal class NetworkSession : RPGSession recvBufferIdx += readAmount; - do - { - switch (NetPacket.TryDeserialize(recvBufferMem[..recvBufferIdx], out NetPacket? packet, out int bytesRead)) - { - case NetPacket.DeserializationResult.Success: - HandleSessionPacketAsync(packet!); - Buffer.BlockCopy(_recvBuffer, bytesRead, _recvBuffer, 0, recvBufferIdx -= bytesRead); - break; - case NetPacket.DeserializationResult.BufferExceeded: - recvBufferIdx = -1; - break; - case NetPacket.DeserializationResult.Corrupted: - throw new InvalidDataException("The network stream was corrupted"); - } - } - while (recvBufferIdx >= NetPacket.Overhead); + int consumed = ConsumeData(recvBufferMem, recvBufferIdx); + if (consumed > 0) + Buffer.BlockCopy(_recvBuffer, consumed, _recvBuffer, 0, recvBufferIdx -= consumed); } } + private int ConsumeData(ReadOnlyMemory recvBufferMem, int recvBufferIdx) + { + int consumedBytes = 0; + + do + { + switch (NetPacket.TryDeserialize(recvBufferMem[consumedBytes..recvBufferIdx], out NetPacket? packet, out int bytesRead)) + { + case NetPacket.DeserializationResult.Success: + HandlePacket(packet!); + consumedBytes += bytesRead; + break; + case NetPacket.DeserializationResult.BufferExceeded: + return consumedBytes; + case NetPacket.DeserializationResult.Corrupted: + throw new InvalidDataException("The network stream was corrupted"); + } + } + while (recvBufferIdx - consumedBytes >= NetPacket.Overhead); + + return consumedBytes; + } + public void ServiceBound(RPGServiceType serviceType) { _boundServices.Add(serviceType); @@ -74,7 +84,7 @@ internal class NetworkSession : RPGSession await Socket!.SendAsync(buffer); } - private void HandleSessionPacketAsync(NetPacket packet) + private void HandlePacket(NetPacket packet) { switch ((CmdType)packet.CmdType) {