Ici je reçois mes données :
private async Task ReceiveLoopAsync(Socket sckReceiver, Action<byte[]> processMessage)
{
byte[] buffer = new byte[4096];
int bytesRead;
await Task.Run(async () =>
{
while (sckReceiver.IsConnected())
{
Array.Clear(buffer, 0, buffer.Length);
bytesRead = await sckReceiver.ReceiveAsync(buffer, SocketFlags.None);
processMessage(buffer);
}
sckReceiver.Close();
});
Ici je les analyses :
public static bool TryParsePacket(byte[] message, int packetOriginEnum, out IPacket packet)
{
byte[] payload;
DofusReader reader = default;
packet = default;
try
{
reader = new DofusReader(new MemoryStream(message));
if (!TryParseHeader(ref reader, packetOriginEnum, out IHeader header))
{
Console.WriteLine("header non complet !");
return false;
}
if(reader.BaseStream.Length < PacketHelper.GetExpectedPacketLength(header,packetOriginEnum))
{
Console.WriteLine("payload non complet !");
return false;
}
payload = reader.ReadBytes(header.PacketLength);
packet = new Packet(payload, header);
return true;
}
finally
{
reader.Dispose();
}
}
private static bool TryParseHeader(ref DofusReader reader, int packetOriginEnum, out IHeader header)
{
short metadata;
int packetId;
uint instanceId;
LengthTypeEnum lengthType;
byte[] dataLengthRead;
int packetLength;
header = default;
if (reader.BytesAvailable < 2)
return false;
metadata = reader.ReadInt16();
packetId = metadata >> BinaryConstants.BIT_RIGHT_SHIFT_LEN_PACKET_ID;
lengthType = (LengthTypeEnum)(metadata & BinaryConstants.BIT_MASK);
if (packetOriginEnum == 0 && reader.BytesAvailable < 4)
return false;
else
instanceId = (packetOriginEnum == 0) ? reader.ReadUInt32() : 0;
if (reader.BytesAvailable < (int)lengthType)
return false;
dataLengthRead = reader.ReadBytes((int)lengthType);
packetLength = ParseDataLength(dataLengthRead, lengthType);
header = new Header(packetId, lengthType, packetLength) { InstanceId = instanceId };
return true;
}
private static int ParseDataLength(byte[] dataLengthReader, LengthTypeEnum lengthType)
{
int len = 0;
for (int i = (int)lengthType - 1, j = 0; i >= 0; i--, j++)
len |= dataLengthReader[j] << (i * 8);
return len;
}
Ensuite je les Forward :
/// <summary>
/// Process message from Client.
/// </summary>
/// <param name="buffer">Data received.</param>
protected override void OnClientData(byte[] buffer)
{
if (!PacketParser.TryParsePacket(buffer, (int)PacketOriginEnum.Client, out IPacket packet))
return;
ForwardMessage(buffer, PacketDestinationEnum.Server, packet);
}
/// <summary>
/// Process message from Server.
/// </summary>
/// <param name="buffer">Data received.</param>
protected override void OnRemoteData(byte[] buffer)
{
if (!PacketParser.TryParsePacket(buffer, (int)PacketOriginEnum.Server, out IPacket packet))
return;
ForwardMessage(buffer, PacketDestinationEnum.Client, packet);
}
Simple méthode qui send le buffer directement et affiche l'header du packet.
public void ForwardMessage(byte[] buffer, PacketDestinationEnum dst, IPacket packet)
{
string origin = dst == PacketDestinationEnum.Client ? "SERVER" : "CLIENT";
if (dst == PacketDestinationEnum.Client)
base.SocketClient.Send(buffer);
else
base.SocketClient.Send(buffer);
Console.WriteLine($"[{packet.Header.ToString()}] forward from [{origin}]");
}
Apres le message 5607 le client m'envoie un message visiblement nul :
