Example #1
0
        public PacketHeader(byte[] header, int offset, Connection connection)
        {
            this.connection = connection;
            PayloadReader pr = new PayloadReader(header);

            pr.Offset += offset;

            PacketSize     = pr.ReadThreeByteInteger();
            isCompressed   = pr.ReadBool();
            isCached       = pr.ReadBool();
            PacketID       = (PacketId)pr.ReadByte();
            MessageId      = pr.ReadUInteger();
            PluginId       = pr.ReadULong();
            isPluginPacket = pr.ReadBool();
            CurPacketId    = pr.ReadUShort();
            Hash           = pr.ReadUInteger();
            ChannelId      = pr.ReadUInteger();
            PeerId         = pr.ReadUInteger();
        }
        private void onPacketTaskQueue(IMessage message)
        {
            MsgPacketQueue msgPacketQueue = message as MsgPacketQueue;

            if (msgPacketQueue == null)
            {
                //client is behaving strange
                Client.Disconnect(DisconnectReason.StrangeBehaviorDetected);
                return;
            }

            PayloadReader pr = new PayloadReader(msgPacketQueue.Data);

            while (pr.Offset < pr.Length)
            {
                PacketId packetId   = (PacketId)pr.ReadByte();
                byte     Duplicates = pr.ReadByte();
                bool     isPlugin   = pr.ReadBool();

                ulong PluginId  = isPlugin ? pr.ReadULong() : 0;
                bool  isChannel = pr.ReadBool();

                uint ChannelConnectionId = isChannel ? pr.ReadUInteger() : 0;
                uint MessageId           = pr.ReadUInteger();

                byte[] data        = pr.ReadBytes(pr.ReadThreeByteInteger());
                int    TotalLength = data.Length * Duplicates;

                for (; Duplicates > 0; Duplicates--)
                {
                    //read the message again in a loop just incase if somebody will change the variables in the message
                    IMessage TempMsg = messageHandler.HandleMessage(new PayloadReader(data), MessageId);

                    switch (packetId)
                    {
                    case PacketId.Payload:
                    {
                        try
                        {
                            //if(DPI.Inspect(data, false))
                            {
                                if (Client.MultiThreadProcessing)
                                {
                                    //ThreadPool.QueueUserWorkItem((object o) => Client.onReceiveMessage(TempMsg));
                                }
                                else
                                {
                                    //Client.onReceiveMessage(TempMsg);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Client.onException(ex, ErrorType.UserLand);
                        }
                        break;
                    }

                    case PacketId.StreamMessages:
                    {
                        StreamQueue.Enqueue(TempMsg);
                        break;
                    }

                    case PacketId.ChannelPayload:
                    {
                        //new R_ChannelPayload(data) { RawSize = data.Length }.ReadPayload(this);
                        break;
                    }
                    }
                }
            }
        }