Implementing Packet Framing

Surrounding packets with Int32 6655 to identify packet structure
This commit is contained in:
2021-12-16 16:41:29 +10:00
parent a9bc8c4e7d
commit ece0dffd85
3 changed files with 122 additions and 40 deletions

View File

@ -73,63 +73,67 @@ namespace Articulate_Network
await Task.Run(() =>
{
byte[] buffer = new byte[bufferSize];
int offset = 0;
while (true)
{
int bytesToRead = tcp.Client.Receive(buffer, offset, buffer.Length - offset, SocketFlags.None);
//Console.WriteLine("Bytes to read: " + bytesToRead);
if (offset > 0)
offset = 0;
var ms = new MemoryStream(buffer, 0, bytesToRead);
var ms = new MemoryStream(buffer);
var br = new BinaryReader(ms);
while (ms.Position < ms.Length)
{
if (ms.Position + 4 > ms.Length)
break;
int magic = br.ReadInt32();
if (magic != 6655)
{
//Console.WriteLine("Not the start of a packet.");
continue;
}
int length = (int)br.ReadInt64();
OnDataReceived(new Articulate_Network.Events.DataReceivedEventArgs()
if (ms.Position + length > ms.Length) // Received partial packet data, store partial data and continue
{
Packet = Get<PacketManager>().DeserializePacket(ms)
});
int end = (int)br.ReadInt64();
bool endOfPacket = end == length;
if (endOfPacket && ms.Position < ms.Length)
{
int nextPacketSize = (int)br.ReadInt64();
ms.Position -= 8;
Console.WriteLine("Next size: " + nextPacketSize);
ms.Position -= 12;
offset = (int)(ms.Length - ms.Position);
//Console.WriteLine($"Partial data. Offset: {offset}");
buffer = new byte[bufferSize];
ms.Read(buffer, 0, offset);
break;
}
//Console.WriteLine(ms.Position);
ms.Position += length;
/*if (ms.Position + length > ms.Length)
int end = (int)br.ReadInt64();
ms.Position -= 8;
ms.Position -= length;
if (length == end && length > 1) // Valid packet, trigger event
{
Console.WriteLine("Bytes to read: " + bytesToRead);
Console.WriteLine("Memory length: " + ms.Length);
Console.WriteLine("Memory Pos: " + ms.Position);
Console.WriteLine("Length: " + length);
ms.Position -= 8;
var p = Get<PacketManager>().DeserializePacket(ms);
buffer = new byte[bufferSize];
ms.Read(buffer, 0, offset);
break;
}*/
OnDataReceived(new Articulate_Network.Events.DataReceivedEventArgs()
{
Packet = p
});
}
else
{
Console.WriteLine($"Not a valid packet. Length: {length} - End: {end} - Offset: {offset} - Position: {ms.Position}");
}
}
}
});