From 4ccf33ad378fca8380418f68d7c3d598773b7106 Mon Sep 17 00:00:00 2001 From: Sanae Date: Tue, 15 Feb 2022 15:17:18 -0600 Subject: [PATCH] Read until received full packet size --- Server/Server.cs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Server/Server.cs b/Server/Server.cs index a4d1e1b..0f61a10 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -92,15 +92,24 @@ public class Server { try { while (true) { memory = memoryPool.Rent(Constants.MaxPacketSize); - int size = await socket.ReceiveAsync(memory.Memory, SocketFlags.None); - if (size == 0) { - // treat it as a disconnect and exit - Logger.Info($"Socket {socket.RemoteEndPoint} disconnected."); - if (socket.Connected) await socket.DisconnectAsync(false); - break; + { + int readOffset = 0; + while (readOffset < Constants.MaxPacketSize) { + int size = await socket.ReceiveAsync(memory.Memory[readOffset..Constants.MaxPacketSize], SocketFlags.None); + if (size == 0) { + // treat it as a disconnect and exit + Logger.Info($"Socket {socket.RemoteEndPoint} disconnected."); + if (socket.Connected) await socket.DisconnectAsync(false); + break; + } + + readOffset += size; + } + + if (readOffset < Constants.MaxPacketSize) break; } - PacketHeader header = GetHeader(memory.Memory.Span[..size]); + PacketHeader header = GetHeader(memory.Memory.Span[..Constants.MaxPacketSize]); //Logger.Info($"first = {first}, type = {header.Type}, data = " + memory.Memory.Span[..size].Hex()); // connection initialization if (first) { @@ -108,7 +117,7 @@ public class Server { if (header.Type != PacketType.Connect) throw new Exception($"First packet was not init, instead it was {header.Type}"); ConnectPacket connect = new ConnectPacket(); - connect.Deserialize(memory.Memory.Span[Constants.HeaderSize..size]); + connect.Deserialize(memory.Memory.Span[Constants.HeaderSize..Constants.MaxPacketSize]); lock (Clients) { bool firstConn = false; switch (connect.ConnectionType) {