Пример #1
0
        /// <summary>
        /// Processes the specified buffer.
        /// </summary>
        internal void OnReceive(byte[] buffer)
        {
            if (buffer != null && this.IsConnected)
            {
                if (buffer.Length >= 7 && buffer.Length <= Constants.BufferSize)
                {
                    Messaging.ReadHeader(buffer, out int id, out int length, out int version);

                    if ((id - 10000 < 10000) && (buffer.Length - 7 >= length))
                    {
                        using (ByteStream stream = new ByteStream(buffer.Skip(7).ToArray()))
                        {
                            PiranhaMessage message = LogicLifeMessageFactory.CreateMessageByType(id, this.Connection, stream);

                            if (message != null)
                            {
                                message.Type    = (Message)id;
                                message.Length  = length;
                                message.Version = (short)version;

                                message.Decrypt();

                                MessageManager.Enqueue(message);
                            }

                            if (!this.Connection.Token.Aborting)
                            {
                                this.Connection.Token.Packet.RemoveRange(0, length + 7);

                                if (buffer.Length - 7 - length >= 7)
                                {
                                    this.OnReceive(stream.ReadBytes(buffer.Length - 7 - length));
                                }
                            }
                        }
                    }
                    else
                    {
                        Debugger.Error("The received buffer length is inferior the header length.");

                        this.Connection.Token.Buffer = null;
                        this.Connection.Token.Packet.Clear();
                    }
                }
                else
                {
                    ServerConnection.Disconnect(this.Connection.Token.Args);
                }
            }
        }