From 8fcdd3494eeaae6a09e19b3adabc50d6fd4fb488 Mon Sep 17 00:00:00 2001 From: qornwh1 Date: Mon, 2 Mar 2026 16:15:05 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20=EB=8D=94=EB=AF=B8=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=20=EC=8B=9C=EA=B0=84=EA=B3=84=EC=82=B0=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EchoDummyService/DummyClients.cs | 15 ++++-- .../Packet/PacketSerializer.cs | 53 +++++++++++++++++++ MMOTestServer/ServerLib/Service/ServerBase.cs | 4 +- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 ClientTester/EchoClientTester/Packet/PacketSerializer.cs diff --git a/ClientTester/EchoClientTester/EchoDummyService/DummyClients.cs b/ClientTester/EchoClientTester/EchoDummyService/DummyClients.cs index 6dec658..c956ee4 100644 --- a/ClientTester/EchoClientTester/EchoDummyService/DummyClients.cs +++ b/ClientTester/EchoClientTester/EchoDummyService/DummyClients.cs @@ -23,21 +23,25 @@ public class DummyClients set; get; } + public int ReceivedCount { set; get; } + public double LastRttMs { set; get; } + public double TotalRttMs { set; get; } + public int RttCount { set; @@ -48,7 +52,7 @@ public class DummyClients { this.clientId = clientId; listener = new EventBasedNetListener(); - manager = new NetManager(listener); + manager = new NetManager(listener); listener.PeerConnectedEvent += netPeer => { @@ -58,13 +62,16 @@ public class DummyClients listener.NetworkReceiveEvent += (peer, reader, channel, deliveryMethod) => { + short code = reader.GetShort(); + short bodyLength = reader.GetShort(); string? msg = reader.GetString(); - string[] parts = msg.Split(':'); - if (parts.Length == 3 && parts[0] == "ack" && parts[1] == "seq" && int.TryParse(parts[2], out int seq) && pendingPings.TryGetValue(seq, out long sentTick)) + if (msg != null && msg.StartsWith("Echo seq:") && + int.TryParse(msg.Substring("Echo seq:".Length), out int seq) && + pendingPings.TryGetValue(seq, out long sentTick)) { double rttMs = (Stopwatch.GetTimestamp() - sentTick) * 1000.0 / Stopwatch.Frequency; - LastRttMs = rttMs; + LastRttMs = rttMs; TotalRttMs += rttMs; RttCount++; pendingPings.Remove(seq); diff --git a/ClientTester/EchoClientTester/Packet/PacketSerializer.cs b/ClientTester/EchoClientTester/Packet/PacketSerializer.cs new file mode 100644 index 0000000..df2c3f1 --- /dev/null +++ b/ClientTester/EchoClientTester/Packet/PacketSerializer.cs @@ -0,0 +1,53 @@ +using ProtoBuf; +using Serilog; + +namespace ClientTester.Packet +{ + // 패킷 헤더 크기 4(패킷 타입, 패킷 길이) + + public static class PacketSerializer + { + // 직렬화: 객체 → byte[] + public static byte[] Serialize(ushort type, ushort size, T packet) + { + MemoryStream ms = new MemoryStream(); + + // 2바이트 패킷 타입 헤더 + ms.WriteByte((byte)(type & 0xFF)); + ms.WriteByte((byte)(type >> 8)); + + // 2바이트 패킷 길이 헤더 + ms.WriteByte((byte)(size & 0xFF)); + ms.WriteByte((byte)(size >> 8)); + + // protobuf 페이로드 + Serializer.Serialize(ms, packet); + return ms.ToArray(); + } + + // 역직렬화: byte[] → (PacketType, payload bytes) + public static (ushort type, ushort size, byte[] payload) Deserialize(byte[] data) + { + if (data.Length < 4) + { + Log.Warning("[PacketHeader]의 길이가 4이하입니다."); + return (0, 0, null)!; + } + + // 길이체크도 필요함 + + ushort type = (ushort)(data[0] | (data[1] << 8)); + ushort size = (ushort)(data[2] | (data[3] << 8)); + byte[] payload = new byte[data.Length - 4]; + Buffer.BlockCopy(data, 4, payload, 0, payload.Length); + return (type, size, payload); + } + + // 페이로드 → 특정 타입으로 역직렬화 + public static T DeserializePayload(byte[] payload) + { + MemoryStream ms = new MemoryStream(payload); + return Serializer.Deserialize(ms); + } + } +} diff --git a/MMOTestServer/ServerLib/Service/ServerBase.cs b/MMOTestServer/ServerLib/Service/ServerBase.cs index 95885b1..bedb4e6 100644 --- a/MMOTestServer/ServerLib/Service/ServerBase.cs +++ b/MMOTestServer/ServerLib/Service/ServerBase.cs @@ -128,7 +128,7 @@ public abstract class ServerBase : INetEventListener // 0이라면 에코 서버 테스트용 따로 처리 if (type == 0) { - HandleEcho(peer, payload); + HandleEcho(peer, data); return; } @@ -190,6 +190,8 @@ public abstract class ServerBase : INetEventListener // 세션에 넣지는 않는다. NetDataReader reader = new NetDataReader(payload); + short code = reader.GetShort(); + short bodyLength = reader.GetShort(); Log.Debug("[Echo] : addr={Addr}, str={Str}", peer.Address, reader.GetString()); SendTo(peer, payload); }