コード例 #1
0
ファイル: Device.cs プロジェクト: w4x51m/Cerberus-V3
        public void Process()
        {
            const int HEADER_LEN = 7;

            var result = false;

            if (DataStream.Count >= 5)
            {
                using (Reader Reader = new Reader(DataStream.ToArray()))
                {
                    ushort Identifier = Reader.ReadUInt16();
                    int    Length     = Reader.ReadInt24();
                    ushort Version    = Reader.ReadUInt16();

                    if (DataStream.Count - HEADER_LEN >= Length)
                    {
                        var message = MessageFactory.Read(this, Reader, Identifier);
                        if (message != null)
                        {
                            message.Identifier = Identifier; // Just in case they don't do it in the constructor.
                            message.Length     = Length;
                            message.Version    = Version;

#if Info
                            Logger.SayInfo("[MESSAGE] " + message.Device.Socket.RemoteEndPoint + " --> " + message.GetType().Name + " [" + message.Identifier + "]");
#endif
                            try
                            {
                                message.Decrypt();
                            }
                            catch (Exception ex)
                            {
                                ExceptionLogger.Log(ex, $"Unable to decrypt message with ID: {Identifier}");
                            }

                            try
                            {
                                message.Decode();
                            }
                            catch (Exception ex)
                            {
                                ExceptionLogger.Log(ex, $"Unable to decode message with ID: {Identifier}");
                            }

                            try { message.Process(); }
                            catch (Exception ex)
                            {
                                ExceptionLogger.Log(ex, $"Exception while processing incoming message {message.GetType()}");
                            }
                        }
                        else
                        {
                            Logger.Say("Unhandled message " + Identifier);

                            // Make sure we don't break the stream.
                            SNonce.Increment();
                        }

                        // Clean up.
                        DataStream.RemoveRange(0, HEADER_LEN + Length);
                        if (DataStream.Count >= 7)
                        {
                            this.Process();
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: Client.cs プロジェクト: skadiD/UCS-GUI
        public void Process(int _Range)
        {
            int[] _Header = new int[3];

            if (_Range >= 7)
            {
                using (Reader _Reader = new Reader(DataStream.ToArray()))
                {
                    _Header[0] = _Reader.ReadUInt16(); // ID

                    _Reader.BaseStream.Seek(1, SeekOrigin.Current);

                    _Header[1] = _Reader.ReadUInt16(); // Length
                    _Header[2] = _Reader.ReadUInt16(); // Version

                    if (DataStream.Count - 7 >= _Header[1])
                    {
                        if (MessageFactory.m_vMessages.ContainsKey(_Header[0]))
                        {
                            Message _Message = Activator.CreateInstance(MessageFactory.m_vMessages[_Header[0]], this, _Reader, _Header) as Message;
                            Level   pl       = _Message.Client.GetLevel();
                            if (_Message != null)
                            {
                                if (Core.Settings.Settings.Debug)
                                {
                                    Console.WriteLine(ConsolePad.Padding(((IPEndPoint)Connection.RemoteEndPoint).Address.ToString()) + " -> " + ConsolePad.Padding(_Message.GetType().Name) + " -> SERVER                  -> " + Interface);
                                }

                                try
                                {
                                    _Message.Decrypt();
                                    _Message.Decode();
                                    _Message.Process();
                                }
                                catch (Exception _Error)
                                {
                                    Console.WriteLine("The player " + (string.IsNullOrEmpty(pl.GetPlayerAvatar().GetAvatarName()) ? "with ID " + pl.GetPlayerAvatar().GetId() : "with name '" + pl.GetPlayerAvatar().GetAvatarName()) + " throwed an exception.");

                                    if (SNonce != null)
                                    {
                                        if (State >= State.LOGGED)
                                        {
                                            // this.SNonce.Increment();
                                        }
                                        else
                                        {
                                            // Login Failed.
                                        }
                                    }
                                    else
                                    {
                                        if (Errors > 5)
                                        {
                                            ResourcesManager.DropClient(this.m_vSocketHandle);
                                        }
                                        else
                                        {
                                            Errors = Errors + 1;
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            SNonce.Increment();
                            Console.WriteLine("The message " + _Header[0] + " can't be processed.");
                        }

                        DataStream.RemoveRange(0, _Header[1] + 7);
                    }
                }
            }
        }