PeekUShort() public method

Peeks a ushort from the stream at the specified position.
public PeekUShort ( int Position ) : ushort
Position int The position to peek at.
return ushort
        protected virtual void ReceiveCallback(IAsyncResult AR)
        {
            try
            {
                Socket Sock = (Socket)AR.AsyncState;
                int NumBytesRead = Sock.EndReceive(AR);

                /** Cant do anything with this! **/
                if (NumBytesRead == 0) { return; }

                byte[] TmpBuf = new byte[NumBytesRead];
                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuf, 0, NumBytesRead);

                //The packet is given an ID of 0x00 because its ID is currently unknown.
                PacketStream TempPacket = new PacketStream(0x00, (ushort)NumBytesRead, TmpBuf);
                byte ID = TempPacket.PeekByte(0);
                Logger.Log("Received packet: " + ID, LogLevel.info);

                ushort PacketLength = 0;
                var handler = FindPacketHandler(ID);

                if (handler != null)
                {
                    PacketLength = handler.Length;
                    Logger.Log("Found matching PacketID!\r\n\r\n", LogLevel.info);

                    if (NumBytesRead == PacketLength)
                    {
                        Logger.Log("Got packet - exact length!\r\n\r\n", LogLevel.info);
                        m_RecvBuf = new byte[11024];

                        OnPacket(new ProcessedPacket(ID, handler.Encrypted, handler.VariableLength, PacketLength,
                            m_ClientEncryptor, TempPacket.ToArray()), handler);
                    }
                    else if (NumBytesRead < PacketLength)
                    {
                        m_TempPacket = new PacketStream(ID, PacketLength);
                        byte[] TmpBuffer = new byte[NumBytesRead];

                        //Store the number of bytes that were read in the temporary buffer.
                        Logger.Log("Got data, but not a full packet - stored " +
                            NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                        Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                        m_TempPacket.WriteBytes(TmpBuffer);

                        //And reset the buffers!
                        m_RecvBuf = new byte[11024];
                        TmpBuffer = null;
                    }
                    else if (PacketLength == 0)
                    {
                        Logger.Log("Received variable length packet!\r\n", LogLevel.info);

                        if (NumBytesRead > (int)PacketHeaders.UNENCRYPTED) //Header is 3 bytes.
                        {
                            PacketLength = TempPacket.PeekUShort(1);

                            if (NumBytesRead == PacketLength)
                            {
                                Logger.Log("Received exact number of bytes for packet!\r\n",
                                    LogLevel.info);

                                m_RecvBuf = new byte[11024];
                                m_TempPacket = null;

                                OnPacket(new ProcessedPacket(ID, handler.Encrypted, handler.VariableLength, PacketLength,
                                    m_ClientEncryptor, TempPacket.ToArray()), handler);
                            }
                            else if (NumBytesRead < PacketLength)
                            {
                                Logger.Log("Didn't receive entire packet - stored: " + PacketLength + " bytes!\r\n",
                                    LogLevel.info);

                                TempPacket.SetLength(PacketLength);
                                m_TempPacket = TempPacket;
                                m_RecvBuf = new byte[11024];
                            }
                            else if (NumBytesRead > PacketLength)
                            {
                                Logger.Log("Received more bytes than needed for packet. Excess: " +
                                    (NumBytesRead - PacketLength) + "\r\n", LogLevel.info);

                                byte[] TmpBuffer = new byte[NumBytesRead - PacketLength];
                                Buffer.BlockCopy(TempPacket.ToArray(), 0, TmpBuffer, 0, TmpBuffer.Length);
                                m_TempPacket = new PacketStream(TmpBuffer[0], (ushort)(NumBytesRead - PacketLength),
                                    TmpBuffer);

                                byte[] PacketBuffer = new byte[PacketLength];
                                Buffer.BlockCopy(TempPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length);

                                m_RecvBuf = new byte[11024];

                                OnPacket(new ProcessedPacket(ID, handler.Encrypted, handler.VariableLength, PacketLength,
                                    m_ClientEncryptor, PacketBuffer), handler);
                            }
                        }
                    }
                }
                else
                {
                    if (m_TempPacket != null)
                    {
                        if (m_TempPacket.Length < m_TempPacket.BufferLength)
                        {
                            //Received the exact number of bytes needed to complete the stored packet.
                            if ((m_TempPacket.BufferLength + NumBytesRead) == m_TempPacket.Length)
                            {
                                byte[] TmpBuffer = new byte[NumBytesRead];
                                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);

                                m_RecvBuf = new byte[11024];
                                TmpBuffer = null;
                            }
                            //Received more than the number of bytes needed to complete the packet!
                            else if ((m_TempPacket.BufferLength + NumBytesRead) > m_TempPacket.Length)
                            {
                                ushort Target = (ushort)((m_TempPacket.BufferLength + NumBytesRead) - m_TempPacket.Length);
                                byte[] TmpBuffer = new byte[Target];

                                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, Target);
                                m_TempPacket.WriteBytes(TmpBuffer);

                                //Now we have a full packet, so call the received event!
                                OnPacket(new ProcessedPacket(m_TempPacket.PacketID, handler.Encrypted,
                                    handler.VariableLength, (ushort)m_TempPacket.Length, m_ClientEncryptor, m_TempPacket.ToArray()), handler);

                                //Copy the remaining bytes in the receiving buffer.
                                TmpBuffer = new byte[NumBytesRead - Target];
                                Buffer.BlockCopy(m_RecvBuf, Target, TmpBuffer, 0, (NumBytesRead - Target));

                                //Give the temporary packet an ID of 0x00 since we don't know its ID yet.
                                TempPacket = new PacketStream(0x00, (ushort)(NumBytesRead - Target), TmpBuffer);
                                ID = TempPacket.PeekByte(0);
                                handler = FindPacketHandler(ID);

                                //This SHOULD be an existing ID, but let's sanity-check it...
                                if (handler != null)
                                {
                                    m_TempPacket = new PacketStream(ID, handler.Length, TempPacket.ToArray());

                                    //Congratulations, you just received another packet!
                                    if (m_TempPacket.Length == m_TempPacket.BufferLength)
                                    {
                                        OnPacket(new ProcessedPacket(m_TempPacket.PacketID, handler.Encrypted,
                                            handler.VariableLength, (ushort)m_TempPacket.Length, m_ClientEncryptor,
                                            m_TempPacket.ToArray()), handler);

                                        //No more data to store on this read, so reset everything...
                                        m_TempPacket = null;
                                        TmpBuffer = null;
                                        m_RecvBuf = new byte[11024];
                                    }
                                }
                                else
                                {
                                    //Houston, we have a problem (this should never occur)!
                                    this.Disconnect();
                                }
                            }
                        }
                    }
                }

                m_Sock.BeginReceive(m_RecvBuf, 0, m_RecvBuf.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), m_Sock);
            }
            catch (SocketException)
            {
                Disconnect();
            }
        }
Esempio n. 2
0
        protected virtual void ReceiveCallback(IAsyncResult AR)
        {
            try
            {
                Socket Sock         = (Socket)AR.AsyncState;
                int    NumBytesRead = Sock.EndReceive(AR);

                /** Cant do anything with this! **/
                if (NumBytesRead == 0)
                {
                    return;
                }

                byte[] TmpBuf = new byte[NumBytesRead];
                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuf, 0, NumBytesRead);

                //The packet is given an ID of 0x00 because its ID is currently unknown.
                PacketStream TempPacket = new PacketStream(0x00, (ushort)NumBytesRead, TmpBuf);
                byte         ID         = TempPacket.PeekByte(0);
                Logger.Log("Received packet: " + ID, LogLevel.info);

                ushort PacketLength = 0;
                var    handler      = FindPacketHandler(ID);

                if (handler != null)
                {
                    PacketLength = handler.Length;
                    Logger.Log("Found matching PacketID!\r\n\r\n", LogLevel.info);

                    if (NumBytesRead == PacketLength)
                    {
                        Logger.Log("Got packet - exact length!\r\n\r\n", LogLevel.info);
                        m_RecvBuf = new byte[11024];

                        OnPacket(new ProcessedPacket(ID, handler.Encrypted, handler.VariableLength, PacketLength,
                                                     m_ClientEncryptor, TempPacket.ToArray()), handler);
                    }
                    else if (NumBytesRead < PacketLength)
                    {
                        m_TempPacket = new PacketStream(ID, PacketLength);
                        byte[] TmpBuffer = new byte[NumBytesRead];

                        //Store the number of bytes that were read in the temporary buffer.
                        Logger.Log("Got data, but not a full packet - stored " +
                                   NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                        Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                        m_TempPacket.WriteBytes(TmpBuffer);

                        //And reset the buffers!
                        m_RecvBuf = new byte[11024];
                        TmpBuffer = null;
                    }
                    else if (PacketLength == 0)
                    {
                        Logger.Log("Received variable length packet!\r\n", LogLevel.info);

                        if (NumBytesRead > (int)PacketHeaders.UNENCRYPTED) //Header is 3 bytes.
                        {
                            PacketLength = TempPacket.PeekUShort(1);

                            if (NumBytesRead == PacketLength)
                            {
                                Logger.Log("Received exact number of bytes for packet!\r\n",
                                           LogLevel.info);

                                m_RecvBuf    = new byte[11024];
                                m_TempPacket = null;

                                OnPacket(new ProcessedPacket(ID, handler.Encrypted, handler.VariableLength, PacketLength,
                                                             m_ClientEncryptor, TempPacket.ToArray()), handler);
                            }
                            else if (NumBytesRead < PacketLength)
                            {
                                Logger.Log("Didn't receive entire packet - stored: " + PacketLength + " bytes!\r\n",
                                           LogLevel.info);

                                TempPacket.SetLength(PacketLength);
                                m_TempPacket = TempPacket;
                                m_RecvBuf    = new byte[11024];
                            }
                            else if (NumBytesRead > PacketLength)
                            {
                                Logger.Log("Received more bytes than needed for packet. Excess: " +
                                           (NumBytesRead - PacketLength) + "\r\n", LogLevel.info);

                                byte[] TmpBuffer = new byte[NumBytesRead - PacketLength];
                                Buffer.BlockCopy(TempPacket.ToArray(), 0, TmpBuffer, 0, TmpBuffer.Length);
                                m_TempPacket = new PacketStream(TmpBuffer[0], (ushort)(NumBytesRead - PacketLength),
                                                                TmpBuffer);

                                byte[] PacketBuffer = new byte[PacketLength];
                                Buffer.BlockCopy(TempPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length);

                                m_RecvBuf = new byte[11024];

                                OnPacket(new ProcessedPacket(ID, handler.Encrypted, handler.VariableLength, PacketLength,
                                                             m_ClientEncryptor, PacketBuffer), handler);
                            }
                        }
                    }
                }
                else
                {
                    if (m_TempPacket != null)
                    {
                        if (m_TempPacket.Length < m_TempPacket.BufferLength)
                        {
                            //Received the exact number of bytes needed to complete the stored packet.
                            if ((m_TempPacket.BufferLength + NumBytesRead) == m_TempPacket.Length)
                            {
                                byte[] TmpBuffer = new byte[NumBytesRead];
                                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);

                                m_RecvBuf = new byte[11024];
                                TmpBuffer = null;
                            }
                            //Received more than the number of bytes needed to complete the packet!
                            else if ((m_TempPacket.BufferLength + NumBytesRead) > m_TempPacket.Length)
                            {
                                ushort Target    = (ushort)((m_TempPacket.BufferLength + NumBytesRead) - m_TempPacket.Length);
                                byte[] TmpBuffer = new byte[Target];

                                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, Target);
                                m_TempPacket.WriteBytes(TmpBuffer);

                                //Now we have a full packet, so call the received event!
                                OnPacket(new ProcessedPacket(m_TempPacket.PacketID, handler.Encrypted,
                                                             handler.VariableLength, (ushort)m_TempPacket.Length, m_ClientEncryptor, m_TempPacket.ToArray()), handler);

                                //Copy the remaining bytes in the receiving buffer.
                                TmpBuffer = new byte[NumBytesRead - Target];
                                Buffer.BlockCopy(m_RecvBuf, Target, TmpBuffer, 0, (NumBytesRead - Target));

                                //Give the temporary packet an ID of 0x00 since we don't know its ID yet.
                                TempPacket = new PacketStream(0x00, (ushort)(NumBytesRead - Target), TmpBuffer);
                                ID         = TempPacket.PeekByte(0);
                                handler    = FindPacketHandler(ID);

                                //This SHOULD be an existing ID, but let's sanity-check it...
                                if (handler != null)
                                {
                                    m_TempPacket = new PacketStream(ID, handler.Length, TempPacket.ToArray());

                                    //Congratulations, you just received another packet!
                                    if (m_TempPacket.Length == m_TempPacket.BufferLength)
                                    {
                                        OnPacket(new ProcessedPacket(m_TempPacket.PacketID, handler.Encrypted,
                                                                     handler.VariableLength, (ushort)m_TempPacket.Length, m_ClientEncryptor,
                                                                     m_TempPacket.ToArray()), handler);

                                        //No more data to store on this read, so reset everything...
                                        m_TempPacket = null;
                                        TmpBuffer    = null;
                                        m_RecvBuf    = new byte[11024];
                                    }
                                }
                                else
                                {
                                    //Houston, we have a problem (this should never occur)!
                                    this.Disconnect();
                                }
                            }
                        }
                    }
                }

                m_Sock.BeginReceive(m_RecvBuf, 0, m_RecvBuf.Length, SocketFlags.None,
                                    new AsyncCallback(ReceiveCallback), m_Sock);
            }
            catch (SocketException)
            {
                Disconnect();
            }
        }
Esempio n. 3
0
        protected virtual void ReceiveCallback(IAsyncResult AR)
        {
            try
            {
                Socket Sock         = (Socket)AR.AsyncState;
                int    NumBytesRead = Sock.EndReceive(AR);

                /** Cant do anything with this! **/
                if (NumBytesRead == 0)
                {
                    return;
                }

                byte[] TmpBuf = new byte[NumBytesRead];
                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuf, 0, NumBytesRead);
                m_RecvBuf = new byte[11024];              //Clear, to make sure this buffer is always fresh.

                if (m_TempPacket == null)                 //No temporary data was stored - beginning of new packet!
                {
                    //The packet is given an ID of 0x00 because its ID is currently unknown.
                    PacketStream UnknownPacket = new PacketStream(0x00, (ushort)NumBytesRead, TmpBuf);
                    byte         ID            = UnknownPacket.PeekByte(0);
                    Logger.Log("Received packet: " + ID, LogLevel.info);

                    ushort PacketLength = 0;
                    m_Handler    = FindPacketHandler(ID);
                    PacketLength = m_Handler.Length;

                    if (PacketLength == 0)                     //Variable length!
                    {
                        if (NumBytesRead >= (int)PacketHeaders.ENCRYPTED)
                        {
                            PacketLength = UnknownPacket.PeekUShort(1);
                        }
                    }
                    else
                    {
                        if (m_TempPacket == null)
                        {
                            m_TempPacket = new PacketStream(ID, PacketLength);
                        }

                        byte[] TmpBuffer = new byte[NumBytesRead];

                        //Store the number of bytes that were read in the temporary buffer.
                        Logger.Log("Got data, but not a full header - stored " +
                                   NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                        Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                        m_TempPacket.WriteBytes(TmpBuffer);

                        TmpBuffer = null;
                    }

                    if (PacketLength != 0)
                    {
                        if (NumBytesRead == PacketLength)
                        {
                            Logger.Log("Got packet - exact length!\r\n\r\n", LogLevel.info);

                            OnPacket(new ProcessedPacket(ID, m_Handler.Encrypted, m_Handler.VariableLength, PacketLength,
                                                         m_ClientEncryptor, UnknownPacket.ToArray()), m_Handler);
                        }
                        else if (NumBytesRead < PacketLength)
                        {
                            if (m_TempPacket == null)
                            {
                                m_TempPacket = new PacketStream(ID, PacketLength);
                            }

                            byte[] TmpBuffer = new byte[NumBytesRead];

                            //Store the number of bytes that were read in the temporary buffer.
                            Logger.Log("Got data, but not a full packet - stored " +
                                       NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                            Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                            m_TempPacket.WriteBytes(TmpBuffer);

                            TmpBuffer = null;
                        }
                        else if (NumBytesRead > PacketLength)
                        {
                            Logger.Log("Received more bytes than needed for packet. Excess: " +
                                       (NumBytesRead - PacketLength) + "\r\n", LogLevel.info);
                            PacketHandler OldHandler = m_Handler;

                            byte[] PacketBuffer = new byte[PacketLength];
                            Buffer.BlockCopy(UnknownPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length);

                            OnPacket(new ProcessedPacket(ID, OldHandler.Encrypted, OldHandler.VariableLength,
                                                         OldHandler.Length, m_ClientEncryptor, PacketBuffer), OldHandler);

                            byte[] TmpBuffer = new byte[NumBytesRead - PacketLength];
                            Buffer.BlockCopy(UnknownPacket.ToArray(), (NumBytesRead - PacketLength) - 1,
                                             TmpBuffer, 0, TmpBuffer.Length);

                            m_TempPacket = new PacketStream(TmpBuffer[0], (ushort)(NumBytesRead - PacketLength),
                                                            TmpBuffer);
                            m_TempPacket.WriteBytes(TmpBuffer);

                            m_Handler    = FindPacketHandler(ID);
                            PacketLength = m_Handler.Length;

                            if (PacketLength == 0)                             //Variable length!
                            {
                                if (m_TempPacket.BufferLength >= (int)PacketHeaders.ENCRYPTED)
                                {
                                    PacketLength = UnknownPacket.PeekUShort(1);
                                    m_TempPacket.SetLength(PacketLength);
                                }
                            }

                            TmpBuffer = null;
                        }
                    }
                }
                else
                {
                    m_TempPacket.WriteBytes(TmpBuf);

                    if (m_TempPacket.Length == 0)                     //Variable length!
                    {
                        if (NumBytesRead >= (int)PacketHeaders.ENCRYPTED)
                        {
                            m_TempPacket.SetLength(m_TempPacket.PeekUShort(1));
                        }
                        else
                        {
                            byte[] TmpBuffer = new byte[NumBytesRead];

                            //Store the number of bytes that were read in the temporary buffer.
                            Logger.Log("Got data, but not a full header - stored " +
                                       NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                            Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                            m_TempPacket.WriteBytes(TmpBuffer);

                            BeginReceive();

                            TmpBuffer = null;
                        }
                    }

                    if (m_TempPacket.BufferLength == m_TempPacket.Length)
                    {
                        Logger.Log("Got packet - exact length!\r\n\r\n", LogLevel.info);

                        OnPacket(new ProcessedPacket(m_TempPacket.PacketID, m_Handler.Encrypted, m_Handler.VariableLength,
                                                     (ushort)m_TempPacket.Length, m_ClientEncryptor, m_TempPacket.ToArray()), m_Handler);
                    }
                    else if (m_TempPacket.BufferLength < m_TempPacket.Length)
                    {
                        byte[] TmpBuffer = new byte[NumBytesRead];

                        //Store the number of bytes that were read in the temporary buffer.
                        Logger.Log("Got data, but not a full packet - stored " +
                                   NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                        Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                        m_TempPacket.WriteBytes(TmpBuffer);

                        TmpBuffer = null;
                    }
                    else if (m_TempPacket.BufferLength > m_TempPacket.Length)
                    {
                        Logger.Log("Received more bytes than needed for packet. Excess: " +
                                   (m_TempPacket.BufferLength - m_TempPacket.Length) + "\r\n", LogLevel.info);
                        PacketHandler OldHandler = m_Handler;

                        byte[] PacketBuffer = new byte[m_TempPacket.Length];
                        Buffer.BlockCopy(m_TempPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length);

                        OnPacket(new ProcessedPacket(OldHandler.ID, OldHandler.Encrypted, OldHandler.VariableLength,
                                                     OldHandler.Length, m_ClientEncryptor, PacketBuffer), OldHandler);

                        byte[] TmpBuffer = new byte[m_TempPacket.BufferLength - m_TempPacket.Length];
                        Buffer.BlockCopy(m_TempPacket.ToArray(), ((int)m_TempPacket.BufferLength - (int)m_TempPacket.Length),
                                         TmpBuffer, 0, TmpBuffer.Length);

                        m_TempPacket = new PacketStream(TmpBuffer[0], (ushort)(m_TempPacket.BufferLength - m_TempPacket.Length),
                                                        TmpBuffer);

                        m_Handler = FindPacketHandler(m_TempPacket.PacketID);
                        ushort PacketLength = m_Handler.Length;

                        if (PacketLength == 0)                         //Variable length!
                        {
                            if (m_TempPacket.BufferLength >= (int)PacketHeaders.ENCRYPTED)
                            {
                                PacketLength = m_TempPacket.PeekUShort(1);
                                m_TempPacket.SetLength(PacketLength);
                            }
                        }
                    }
                }

                m_Sock.BeginReceive(m_RecvBuf, 0, m_RecvBuf.Length, SocketFlags.None,
                                    new AsyncCallback(ReceiveCallback), m_Sock);
            }
            catch (SocketException)
            {
                Disconnect();
            }
        }
        protected virtual void ReceiveCallback(IAsyncResult AR)
        {
            try
            {
                Socket Sock = (Socket)AR.AsyncState;
                int NumBytesRead = Sock.EndReceive(AR);

                /** Cant do anything with this! **/
                if (NumBytesRead == 0) { return; }

                byte[] TmpBuf = new byte[NumBytesRead];
                Buffer.BlockCopy(m_RecvBuf, 0, TmpBuf, 0, NumBytesRead);
                m_RecvBuf = new byte[11024]; //Clear, to make sure this buffer is always fresh.

                if (m_TempPacket == null) //No temporary data was stored - beginning of new packet!
                {
                    //The packet is given an ID of 0x00 because its ID is currently unknown.
                    PacketStream UnknownPacket = new PacketStream(0x00, (ushort)NumBytesRead, TmpBuf);
                    byte ID = UnknownPacket.PeekByte(0);
                    Logger.Log("Received packet: " + ID, LogLevel.info);

                    ushort PacketLength = 0;
                    m_Handler = FindPacketHandler(ID);
                    PacketLength = m_Handler.Length;

                    if (PacketLength == 0) //Variable length!
                    {
                        if (NumBytesRead >= (int)PacketHeaders.ENCRYPTED)
                            PacketLength = UnknownPacket.PeekUShort(1);
                    }
                    else
                    {
                        if (m_TempPacket == null)
                            m_TempPacket = new PacketStream(ID, PacketLength);

                        byte[] TmpBuffer = new byte[NumBytesRead];

                        //Store the number of bytes that were read in the temporary buffer.
                        Logger.Log("Got data, but not a full header - stored " +
                            NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                        Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                        m_TempPacket.WriteBytes(TmpBuffer);

                        TmpBuffer = null;
                    }

                    if (PacketLength != 0)
                    {
                        if (NumBytesRead == PacketLength)
                        {
                            Logger.Log("Got packet - exact length!\r\n\r\n", LogLevel.info);

                            OnPacket(new ProcessedPacket(ID, m_Handler.Encrypted, m_Handler.VariableLength, PacketLength,
                                m_ClientEncryptor, UnknownPacket.ToArray()), m_Handler);
                        }
                        else if (NumBytesRead < PacketLength)
                        {
                            if (m_TempPacket == null)
                                m_TempPacket = new PacketStream(ID, PacketLength);

                            byte[] TmpBuffer = new byte[NumBytesRead];

                            //Store the number of bytes that were read in the temporary buffer.
                            Logger.Log("Got data, but not a full packet - stored " +
                                NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                            Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                            m_TempPacket.WriteBytes(TmpBuffer);

                            TmpBuffer = null;
                        }
                        else if (NumBytesRead > PacketLength)
                        {
                            Logger.Log("Received more bytes than needed for packet. Excess: " +
                                (NumBytesRead - PacketLength) + "\r\n", LogLevel.info);
                            PacketHandler OldHandler = m_Handler;

                            byte[] PacketBuffer = new byte[PacketLength];
                            Buffer.BlockCopy(UnknownPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length);

                            OnPacket(new ProcessedPacket(ID, OldHandler.Encrypted, OldHandler.VariableLength,
                                OldHandler.Length, m_ClientEncryptor, PacketBuffer), OldHandler);

                            byte[] TmpBuffer = new byte[NumBytesRead - PacketLength];
                            Buffer.BlockCopy(UnknownPacket.ToArray(), (NumBytesRead - PacketLength) - 1,
                                TmpBuffer, 0, TmpBuffer.Length);

                            m_TempPacket = new PacketStream(TmpBuffer[0], (ushort)(NumBytesRead - PacketLength),
                                TmpBuffer);
                            m_TempPacket.WriteBytes(TmpBuffer);

                            m_Handler = FindPacketHandler(ID);
                            PacketLength = m_Handler.Length;

                            if (PacketLength == 0) //Variable length!
                            {
                                if (m_TempPacket.BufferLength >= (int)PacketHeaders.ENCRYPTED)
                                {
                                    PacketLength = UnknownPacket.PeekUShort(1);
                                    m_TempPacket.SetLength(PacketLength);
                                }
                            }

                            TmpBuffer = null;
                        }
                    }
                }
                else
                {
                    m_TempPacket.WriteBytes(TmpBuf);

                    if (m_TempPacket.Length == 0) //Variable length!
                    {
                        if (NumBytesRead >= (int)PacketHeaders.ENCRYPTED)
                            m_TempPacket.SetLength(m_TempPacket.PeekUShort(1));
                        else
                        {
                            byte[] TmpBuffer = new byte[NumBytesRead];

                            //Store the number of bytes that were read in the temporary buffer.
                            Logger.Log("Got data, but not a full header - stored " +
                                NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                            Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                            m_TempPacket.WriteBytes(TmpBuffer);

                            BeginReceive();

                            TmpBuffer = null;
                        }
                    }

                    if (m_TempPacket.BufferLength == m_TempPacket.Length)
                    {
                        Logger.Log("Got packet - exact length!\r\n\r\n", LogLevel.info);

                        OnPacket(new ProcessedPacket(m_TempPacket.PacketID, m_Handler.Encrypted, m_Handler.VariableLength,
                            (ushort)m_TempPacket.Length, m_ClientEncryptor, m_TempPacket.ToArray()), m_Handler);
                    }
                    else if (m_TempPacket.BufferLength < m_TempPacket.Length)
                    {
                        byte[] TmpBuffer = new byte[NumBytesRead];

                        //Store the number of bytes that were read in the temporary buffer.
                        Logger.Log("Got data, but not a full packet - stored " +
                            NumBytesRead.ToString() + "bytes!\r\n\r\n", LogLevel.info);
                        Buffer.BlockCopy(m_RecvBuf, 0, TmpBuffer, 0, NumBytesRead);
                        m_TempPacket.WriteBytes(TmpBuffer);

                        TmpBuffer = null;
                    }
                    else if (m_TempPacket.BufferLength > m_TempPacket.Length)
                    {
                        Logger.Log("Received more bytes than needed for packet. Excess: " +
                            (m_TempPacket.BufferLength - m_TempPacket.Length) + "\r\n", LogLevel.info);
                        PacketHandler OldHandler = m_Handler;

                        byte[] PacketBuffer = new byte[m_TempPacket.Length];
                        Buffer.BlockCopy(m_TempPacket.ToArray(), 0, PacketBuffer, 0, PacketBuffer.Length);

                        OnPacket(new ProcessedPacket(OldHandler.ID, OldHandler.Encrypted, OldHandler.VariableLength,
                            OldHandler.Length, m_ClientEncryptor, PacketBuffer), OldHandler);

                        byte[] TmpBuffer = new byte[m_TempPacket.BufferLength - m_TempPacket.Length];
                        Buffer.BlockCopy(m_TempPacket.ToArray(), ((int)m_TempPacket.BufferLength - (int)m_TempPacket.Length),
                            TmpBuffer, 0, TmpBuffer.Length);

                        m_TempPacket = new PacketStream(TmpBuffer[0], (ushort)(m_TempPacket.BufferLength - m_TempPacket.Length),
                            TmpBuffer);

                        m_Handler = FindPacketHandler(m_TempPacket.PacketID);
                        ushort PacketLength = m_Handler.Length;

                        if (PacketLength == 0) //Variable length!
                        {
                            if (m_TempPacket.BufferLength >= (int)PacketHeaders.ENCRYPTED)
                            {
                                PacketLength = m_TempPacket.PeekUShort(1);
                                m_TempPacket.SetLength(PacketLength);
                            }
                        }
                    }
                }

                m_Sock.BeginReceive(m_RecvBuf, 0, m_RecvBuf.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), m_Sock);
            }
            catch (SocketException)
            {
                Disconnect();
            }
        }