From 6c5d546026c8fe32846ae8e96ba7cf20648fe706 Mon Sep 17 00:00:00 2001 From: Kei-Luna Date: Wed, 13 May 2026 19:09:41 +0900 Subject: [PATCH] Compress large packets --- GameServer/Game/Player/PlayerInstance.cs | 4 +--- .../Packet/Send/Login/PacketRspLogin.cs | 2 +- TcpSharp/BasePacket.cs | 1 + TcpSharp/PacketCodec.cs | 23 +++++++++++++++---- version.txt | 2 +- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 7651dac..d5db436 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -226,9 +226,7 @@ public class PlayerInstance(PlayerGameData data) continue; } - //ToDo - //Temporary fix for login issues(need to handle LoginRsp properly with zlib.) - //proto.Attrs[ToPackedAttrKey(gid, sid)] = val; + proto.Attrs[ToPackedAttrKey(gid, sid)] = val; proto.Attrs[ToShiftedAttrKey(gid, sid)] = val; } diff --git a/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs b/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs index ef626b5..c3bec83 100644 --- a/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs +++ b/GameServer/Server/Packet/Send/Login/PacketRspLogin.cs @@ -22,7 +22,7 @@ public class PacketRspLogin : BasePacket }; var bytes = Google.Protobuf.MessageExtensions.ToByteArray(proto); - Logger.Info($"RspLogin proto size: {bytes.Length} bytes (limit: 65535)"); + Logger.Info($"RspLogin proto size: {bytes.Length} bytes"); SetData(bytes); } diff --git a/TcpSharp/BasePacket.cs b/TcpSharp/BasePacket.cs index f0241e5..fa8b27d 100644 --- a/TcpSharp/BasePacket.cs +++ b/TcpSharp/BasePacket.cs @@ -12,6 +12,7 @@ public class BasePacket public long Timestamp { get; set; } public IMessage? Message { get; set; } public PacketFraming Framing { get; set; } + public int UncompressedBodySize { get; set; } public BasePacket(ushort cmdId) { diff --git a/TcpSharp/PacketCodec.cs b/TcpSharp/PacketCodec.cs index 99c17aa..9ea4a53 100644 --- a/TcpSharp/PacketCodec.cs +++ b/TcpSharp/PacketCodec.cs @@ -2,6 +2,7 @@ using MikuSB.Enums.Packet; using MikuSB.Util; using System.Buffers.Binary; +using System.IO.Compression; using System.Net.Sockets; namespace MikuSB.TcpSharp @@ -63,11 +64,11 @@ namespace MikuSB.TcpSharp } } - public byte[] Encode(ushort packetId, byte[] payload, PacketFraming framing = PacketFraming.FourByteLittleEndianLength) + public byte[] Encode(ushort packetId, byte[] payload, PacketFraming framing = PacketFraming.FourByteLittleEndianLength, int uncompressedSize = 0) { return framing switch { - PacketFraming.TwoByteBigEndianLength => EncodeTwoByteFrame(packetId, payload), + PacketFraming.TwoByteBigEndianLength => EncodeTwoByteFrame(packetId, payload, uncompressedSize), PacketFraming.FourByteLittleEndianLength => EncodeFourByteFrame(packetId, payload), _ => EncodeFourByteFrame(packetId, payload) }; @@ -220,8 +221,20 @@ namespace MikuSB.TcpSharp return payload; } - private byte[] EncodeTwoByteFrame(ushort packetId, byte[] payload) + private const int CompressionThreshold = 60000; + + private static byte[] ZlibCompress(byte[] data) { + using var ms = new MemoryStream(); + using (var zlib = new ZLibStream(ms, CompressionLevel.Optimal, leaveOpen: true)) + zlib.Write(data, 0, data.Length); + return ms.ToArray(); + } + + private byte[] EncodeTwoByteFrame(ushort packetId, byte[] payload, int uncompressedSize = 0) + { + if (payload.Length > CompressionThreshold) + payload = ZlibCompress(payload); var wrappedPayload = WrapPayload(payload); var buffer = new byte[HeaderSize4Byte + wrappedPayload.Length]; @@ -246,7 +259,9 @@ namespace MikuSB.TcpSharp const int wrapperHeaderSize = 35; var wrapped = new byte[wrapperHeaderSize + payload.Length]; BinaryPrimitives.WriteUInt16LittleEndian(wrapped.AsSpan(6, 2), (ushort)payload.Length); - wrapped[11] = 1; + if (payload.Length >= 2 && payload[0] == 0x78 && + (payload[1] == 0x01 || payload[1] == 0x5E || payload[1] == 0x9C || payload[1] == 0xDA)) + wrapped[10] = 2; payload.CopyTo(wrapped.AsSpan(wrapperHeaderSize)); return wrapped; diff --git a/version.txt b/version.txt index a1df975..70922a4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v=2.6 \ No newline at end of file +v=2.7 \ No newline at end of file