Example #1
0
        public void ProcessFromClient(byte[] buffer)
        {
            int length = buffer.Length;

            Array.Copy(buffer, clientRecvMsg.GetBuffer(), length);
            clientRecvMsg.Length = length;

            OnReceivedDataFromClient(clientRecvMsg.Data);

            switch (protocol)
            {
            case Protocol.None:
            case Protocol.Login:
                ParseFirstClientMsg();
                break;

            case Protocol.World:
                bool adlerOkay   = clientRecvMsg.CheckAdler32();
                bool decryptOkay = clientRecvMsg.XteaDecrypt(client.IO.XteaKey);
                if (adlerOkay && decryptOkay)
                {
                    clientRecvMsg.Position = 6;
                    int msgLength = (int)clientRecvMsg.GetUInt16() + 8;


                    int position = clientRecvMsg.Position;

                    if (!ParsePacketFromClient(client, clientRecvMsg, serverSendMsg))
                    {
                        //unknown packet
                        byte[] unknown = clientRecvMsg.GetBytes(clientRecvMsg.Length - clientRecvMsg.Position);

                        OnSplitPacketFromClient(unknown[0], unknown);
                    }

                    byte[] data = new byte[clientRecvMsg.Position - position];
                    Array.Copy(clientRecvMsg.GetBuffer(), position, data, 0, data.Length);
                    OnSplitPacketFromClient(data[0], data);
                }
                break;
            }
        }
Example #2
0
        private void ClientReadCallBack(IAsyncResult ar)
        {
            byte[] clientData = null;
            try
            {
                int read = clientStream.EndRead(ar);

                if (read < 2)
                {
                    Restart();
                    return;
                }

                int pSize = (int)BitConverter.ToUInt16(clientRecvMsg.GetBuffer(), 0) + 2;

                while (read < pSize)
                {
                    if (clientStream.CanRead)
                    {
                        read += clientStream.Read(clientRecvMsg.GetBuffer(), read, pSize - read);
                    }
                    else
                    {
                        throw new Exception("Connection broken.");
                    }
                }

                clientRecvMsg.Length = pSize;

                switch (protocol)
                {
                case Protocol.None:
                    ParseFirstClientMsg();
                    break;

                case Protocol.World:
                    OnReceivedDataFromClient(clientRecvMsg.Data);

                    clientData = clientRecvMsg.Data;

                    if (clientRecvMsg.CheckAdler32() && clientRecvMsg.XteaDecrypt(xteaKey))
                    {
                        clientRecvMsg.Position = clientRecvMsg.GetPacketHeaderSize();
                        int msgLength = (int)clientRecvMsg.GetUInt16() + 8;
                        serverSendMsg.Reset();


                        int position = clientRecvMsg.Position;

                        if (!ParsePacketFromClient(client, clientRecvMsg, serverSendMsg))
                        {
                            //unknown packet
                            byte[] unknown = clientRecvMsg.GetBytes(clientRecvMsg.Length - clientRecvMsg.Position);

                            OnSplitPacketFromClient(unknown[0], unknown);

                            WriteDebug("Unknown outgoing packet: " + unknown.ToHexString());
                            serverSendMsg.AddBytes(unknown);
                        }

                        byte[] data = new byte[clientRecvMsg.Position - position];
                        Array.Copy(clientRecvMsg.GetBuffer(), position, data, 0, data.Length);
                        OnSplitPacketFromClient(data[0], data);

                        if (AllowOutgoingModification &&
                            serverSendMsg.Length > serverSendMsg.GetPacketHeaderSize() + 2)
                        {
                            serverSendMsg.InsetLogicalPacketHeader();
                            serverSendMsg.PrepareToSend(xteaKey);

                            SendToServer(serverSendMsg.Data);
                        }
                        else
                        {
                            SendToServer(clientData);
                        }
                    }
                    else
                    {
                        SendToServer(clientData);
                    }
                    clientStream.BeginRead(clientRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ClientReadCallBack), null);
                    break;

                case Protocol.Login:
                    break;
                }
            }
            catch (ObjectDisposedException) { /*We don't have to log this exception. */ }
            catch (System.IO.IOException ex) { WriteDebug(ex.ToString()); }
            catch (Exception ex)
            {
                WriteDebug(ex.ToString());
                if (clientData != null)
                {
                    SendToServer(clientData);
                }
            }
        }
Example #3
0
        public void ProcessFromServer(byte[] buffer)
        {
            int length = (int)BitConverter.ToUInt16(buffer, 0) + 2;

            if (length > buffer.Length)
            {
                // Packet is split into multiple chunks
                if (partialPacketSize == 0)
                {
                    // This is the first chunk
                    fullPacketSize = length;
                    Array.Copy(buffer, serverRecvMsg.GetBuffer(), buffer.Length);
                    partialPacketSize = buffer.Length;
                    return;
                }
                else
                {
                    // This is a subsequent chunk
                    Array.Copy(buffer, 0, serverRecvMsg.GetBuffer(), partialPacketSize, buffer.Length);
                    partialPacketSize += buffer.Length;

                    if (partialPacketSize < fullPacketSize)
                    {
                        // Packet is still incomplete
                        return;
                    }
                    else
                    {
                        // Packet is complete
                        serverRecvMsg.Length = fullPacketSize;
                    }
                }
            }
            else
            {
                fullPacketSize    = 0;
                partialPacketSize = 0;
                Array.Copy(buffer, serverRecvMsg.GetBuffer(), length);
                serverRecvMsg.Length = length;
            }

            OnReceivedDataFromServer(serverRecvMsg.Data);

            switch (protocol)
            {
            case Protocol.Login:
                break;

            case Protocol.World:
                bool adlerOkay   = serverRecvMsg.CheckAdler32();
                bool decryptOkay = serverRecvMsg.XteaDecrypt(client.IO.XteaKey);
                if (adlerOkay && decryptOkay)
                {
                    serverRecvMsg.Position = 6;
                    int msgSize = (int)serverRecvMsg.GetUInt16() + 8;
                    clientSendMsg.Reset();

                    while (serverRecvMsg.Position < msgSize)
                    {
                        int  position = serverRecvMsg.Position;
                        bool parsed   = false;

                        try
                        {
                            parsed = ParsePacketFromServer(client, serverRecvMsg, clientSendMsg);
                        }
                        catch (Exception ex)
                        {
                            WriteDebug(ex.Message + "\nStackTrace: " + ex.StackTrace);
                        }

                        if (!parsed)
                        {
                            if (serverRecvMsg.Length - serverRecvMsg.Position > 0 &&
                                serverRecvMsg.Length < serverRecvMsg.GetBuffer().Length)
                            {
                                byte[] unknown = serverRecvMsg.GetBytes(serverRecvMsg.Length - serverRecvMsg.Position);
                                OnSplitPacketFromServer(unknown[0], unknown);
                            }
                            break;
                        }

                        if (serverRecvMsg.Position - position > 0)
                        {
                            byte[] data = new byte[serverRecvMsg.Position - position];
                            Array.Copy(serverRecvMsg.GetBuffer(), position, data, 0, data.Length);

                            OnSplitPacketFromServer(data[0], data);
                        }
                    }
                }
                break;

            case Protocol.None:
                break;
            }
        }