Ark.Packet.ReadFromStreamAsync C# (CSharp) Method

ReadFromStreamAsync() public static method

public static ReadFromStreamAsync ( NetworkStream stream ) : Task
stream System.Net.Sockets.NetworkStream
return Task
        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;
        }

Usage Example

        private async Task ProcessPacketStream()
        {
            try
            {
                while (IsConnected && (OutgoingPackets.Count != 0 || TcpClient.Available != 0))
                {
                    while (IsConnected && TcpClient.Available != 0)
                    {
                        if (ReceivedPacket != null)
                        {
                            ReceivedPacket(this, new PacketEventArgs()
                            {
                                Packet = await Packet.ReadFromStreamAsync(TcpClientStream)
                            });
                        }

                        IncomingPacketReceieved = true;
                    }


                    if (IsConnected && CanSendPacket && OutgoingPackets.Count != 0)
                    {
                        await OutgoingPackets.Dequeue().WriteToStreamAsync(TcpClientStream);

                        OutgoingPacketCooldown.Restart();
                        IncomingPacketReceieved = false;
                    }

                    //// We've successfully sent or recieved data so the keepalive can be pushed back.
                    //Keepalive.Reset();
                }
            }
            catch
            {
                // Lost connection with the server
                // No handling is necessary here as the TCPClient will set Connected to false.
                if (ServerConnectionDropped != null)
                {
                    ServerConnectionDropped(this, new ServerConnectionEventArgs()
                    {
                        Message = "Connection to the server has been lost.", Status = ServerConnectionStatus.Disconnected, Timestamp = DateTime.Now
                    });
                }
            }
        }