public static async Task<Packet> ReadFromStreamAsync(NetworkStream stream)
{
Packet packet = new Packet();
byte[] sizeBuffer = new byte[4];
stream.Read(sizeBuffer, 0, 4);
packet.PacketSize = BitConverter.ToInt32(sizeBuffer, 0);
byte[] packetBuffer = new byte[packet.PacketSize];
if(packet.PacketSize != 0)
{
int readProgress = 0;
while(readProgress < packet.PacketSize)
{
int read = await stream.ReadAsync(packetBuffer, readProgress, packet.PacketSize - readProgress);
readProgress += read;
if(read == 0)
{
throw new Exception("NetworkStream failed to read data. Connection may have been lost!");
}
}
}
packet.Opcode = (Opcode)BitConverter.ToInt32(packetBuffer, 0);
packet.Type = (PacketType)BitConverter.ToInt32(packetBuffer, 4);
Array.Copy(packetBuffer, 8, packet.Data, 0, packet.DataSize);
Console.WriteLine("Recieved {0}", packet.DataAsString());
return packet;
}