/// <summary>
        ///     Invoked when this server recieves a packet from this client.
        /// </summary>
        /// <param name="asyn">Asyncronous state.</param>
        private void OnRecievePacket(IAsyncResult asyn)
        {
            if (_socket == null || (_socket.Connected == false && _isListening == false && _isConnected == true))
                return;
            try
            {
                // Reading the header.
                if (_recieveBuffer.Length == NetworkPacket.HEADER_SIZE)
                {
                    // Finish recieving.
                    _socket.EndReceive(asyn);

                    // Decode the header.
                    _recievedPacket = new NetworkPacket();
                    _recievedPacket.Decode(_recieveBuffer, true, false);

                    _globalBytesRecieved += _recieveBuffer.Length;
                    _bytesRecieved += _recieveBuffer.Length;

                    // No extra data?
                    if (_recievedPacket.DataLength <= 0)
                    {
                        // Evaluate the packet.
                        if (EvaluatePacket(_recievedPacket) == false)
                        {
                            if (PacketRecieved != null) PacketRecieved(this, _recievedPacket);
                            if (_asyncRecievePacketID == -1 || _recievedPacket.ID == _asyncRecievePacketID)
                                _asyncRecievePacket = _recievedPacket;
                            _recievedPacket = null;
                        }

                        // Go back to recieving general data.
                        BeginRecieving(NetworkPacket.HEADER_SIZE);
                    }
                    else
                    {
                        // Read in the rest of the packet.
                        BeginRecieving(_recievedPacket.DataLength);
                    }
                }

                // Reading the data.
                else
                {
                    // Finish recieving.
                    _socket.EndReceive(asyn);

                    // Decode rest of data.
                    _recievedPacket.Decode(_recieveBuffer, false, true);

                    _globalBytesRecieved += _recieveBuffer.Length;
                    _bytesRecieved += _recieveBuffer.Length;

                    // Evaluate the packet.
                    if (EvaluatePacket(_recievedPacket) == false)
                    {
                        if (PacketRecieved != null) PacketRecieved(this, _recievedPacket);
                        if (_asyncRecievePacketID == -1 || _recievedPacket.ID == _asyncRecievePacketID)
                            _asyncRecievePacket = _recievedPacket;
                        _recievedPacket = null;
                    }

                    // Go back to recieving general data.
                    BeginRecieving(NetworkPacket.HEADER_SIZE);
                }
            }
            catch (Exception)
            { }
        }