Compare commits

...

1 Commits

Author SHA1 Message Date
Kei-Luna
6c5d546026 Compress large packets 2026-05-13 19:09:41 +09:00
5 changed files with 23 additions and 9 deletions

View File

@@ -226,9 +226,7 @@ public class PlayerInstance(PlayerGameData data)
continue; continue;
} }
//ToDo proto.Attrs[ToPackedAttrKey(gid, sid)] = val;
//Temporary fix for login issues(need to handle LoginRsp properly with zlib.)
//proto.Attrs[ToPackedAttrKey(gid, sid)] = val;
proto.Attrs[ToShiftedAttrKey(gid, sid)] = val; proto.Attrs[ToShiftedAttrKey(gid, sid)] = val;
} }

View File

@@ -22,7 +22,7 @@ public class PacketRspLogin : BasePacket
}; };
var bytes = Google.Protobuf.MessageExtensions.ToByteArray(proto); 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); SetData(bytes);
} }

View File

@@ -12,6 +12,7 @@ public class BasePacket
public long Timestamp { get; set; } public long Timestamp { get; set; }
public IMessage? Message { get; set; } public IMessage? Message { get; set; }
public PacketFraming Framing { get; set; } public PacketFraming Framing { get; set; }
public int UncompressedBodySize { get; set; }
public BasePacket(ushort cmdId) public BasePacket(ushort cmdId)
{ {

View File

@@ -2,6 +2,7 @@
using MikuSB.Enums.Packet; using MikuSB.Enums.Packet;
using MikuSB.Util; using MikuSB.Util;
using System.Buffers.Binary; using System.Buffers.Binary;
using System.IO.Compression;
using System.Net.Sockets; using System.Net.Sockets;
namespace MikuSB.TcpSharp 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 return framing switch
{ {
PacketFraming.TwoByteBigEndianLength => EncodeTwoByteFrame(packetId, payload), PacketFraming.TwoByteBigEndianLength => EncodeTwoByteFrame(packetId, payload, uncompressedSize),
PacketFraming.FourByteLittleEndianLength => EncodeFourByteFrame(packetId, payload), PacketFraming.FourByteLittleEndianLength => EncodeFourByteFrame(packetId, payload),
_ => EncodeFourByteFrame(packetId, payload) _ => EncodeFourByteFrame(packetId, payload)
}; };
@@ -220,8 +221,20 @@ namespace MikuSB.TcpSharp
return payload; 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 wrappedPayload = WrapPayload(payload);
var buffer = new byte[HeaderSize4Byte + wrappedPayload.Length]; var buffer = new byte[HeaderSize4Byte + wrappedPayload.Length];
@@ -246,7 +259,9 @@ namespace MikuSB.TcpSharp
const int wrapperHeaderSize = 35; const int wrapperHeaderSize = 35;
var wrapped = new byte[wrapperHeaderSize + payload.Length]; var wrapped = new byte[wrapperHeaderSize + payload.Length];
BinaryPrimitives.WriteUInt16LittleEndian(wrapped.AsSpan(6, 2), (ushort)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)); payload.CopyTo(wrapped.AsSpan(wrapperHeaderSize));
return wrapped; return wrapped;

View File

@@ -1 +1 @@
v=2.6 v=2.7