Implementing Packet Framing
Surrounding packets with Int32 6655 to identify packet structure
This commit is contained in:
66
Client.cs
66
Client.cs
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user