コード例 #1
0
ファイル: HttpDecoder.cs プロジェクト: victoryfree/Netronics
        public dynamic Decode(IChannel channel, PacketBuffer buffer)
        {
            buffer.BeginBufferIndex();
            if(buffer.AvailableBytes() > MaxBufferSize)
            {
                channel.Disconnect();
                return null;
            }

            if (buffer.AvailableBytes() == 0)
                return null;

            Request request;

            try
            {
                request = Request.Parse(buffer);
            }
            catch (Exception)
            {
                buffer.ResetBufferIndex();
                return null;
            }

            buffer.EndBufferIndex();
            return request;
        }
コード例 #2
0
ファイル: BsonDecoder.cs プロジェクト: victoryfree/Netronics
        /// <summary>
        /// BSON 패킷 구조를 따르는 PacketBuffer을 BSON Data로 변환 시키는 메서드
        /// </summary>
        /// <param name="buffer">BSON 패킷 구조를 따르는 Packet Buffer</param>
        /// <returns>BSON Data</returns>
        public dynamic Decode(IChannel channel, PacketBuffer buffer)
        {
            //버퍼 읽기 시작을 알림
            buffer.BeginBufferIndex();

            if (buffer.AvailableBytes() < 5) //버퍼길이가 5미만이면 리턴
                return null;

            uint len = buffer.ReadUInt32();
            if (len > buffer.AvailableBytes())
            {
                //버퍼의 길이가 실제 패킷 길이보다 모자름으로, 리셋후 리턴
                buffer.ResetBufferIndex();
                return null;
            }

            var data = new byte[len];
            buffer.ReadBytes(data);

            buffer.EndBufferIndex();

            var stream = new MemoryStream(data);
            dynamic res = Serializer.Deserialize(new BsonReader(stream));
            stream.Dispose();

            return res;
        }
コード例 #3
0
ファイル: MsgPackDecoder.cs プロジェクト: shlee322/Netronics
        public object Decode(IChannel channel, PacketBuffer buffer)
        {
            //버퍼 읽기 시작을 알림
            buffer.BeginBufferIndex();

            if (buffer.AvailableBytes() < 6) //버퍼길이가 5미만이면 리턴
                return null;
            buffer.ReadByte();
            uint len = buffer.ReadUInt32();
            if (len > buffer.AvailableBytes())
            {
                //버퍼의 길이가 실제 패킷 길이보다 모자름으로, 리셋후 리턴
                buffer.ResetBufferIndex();
                return null;
            }

            var data = new byte[len];
            buffer.ReadBytes(data);

            buffer.EndBufferIndex();

            var stream = new MemoryStream(data);
            var res = Unpacker.Create(stream).Unpack<MessagePackObject>();
            stream.Dispose();

            return res;
        }
コード例 #4
0
        public dynamic Decode(IChannel channel, PacketBuffer buffer)
        {
            buffer.BeginBufferIndex();
            var stream = new MemoryStream();
            while (true)
            {
                if (buffer.AvailableBytes() < 2)
                    return null;
                byte frameH = buffer.ReadByte();
                byte frameP = buffer.ReadByte();
                int len = frameP & 0x7F;
                if (len > 0x7D)
                {
                    if (buffer.AvailableBytes() < 2)
                        return null;

                    for (var i = 0; i < 2; i++)
                        len = (len << 8) + buffer.ReadByte();

                    if ((frameP & 0x7F) == 0x7F)
                    {
                        if (buffer.AvailableBytes() < 2)
                            return null;
                        for (var i = 0; i < 2; i++)
                            len = (len << 8) + buffer.ReadByte();
                    }
                }

                if (buffer.AvailableBytes() < 4 + len)
                    return null;

                byte[] key = (frameP & 0x80) == 0x80 ? buffer.ReadBytes(4) : null;

                byte[] data = null;
                if (key == null)
                {
                    data = buffer.ReadBytes(len);
                }
                else
                {
                    data = new byte[len];
                    for (int i = 0; i < len; i++)
                        data[i] = (byte) (buffer.ReadByte() ^ key[i%4]);
                }
                stream.Write(data, 0, len);

                if ((frameH & 0xF) == 8)
                {
                    buffer.EndBufferIndex();
                    return new ConnectionClose();
                }
                if ((frameH & 0xF) == 9)
                {
                    buffer.EndBufferIndex();
                    return new Ping();
                }
                if((frameH & 0xF) == 10)
                {
                    buffer.EndBufferIndex();
                    return new Pong();
                }

                if((frameH & 0x80) == 128)
                    break;
            }
            buffer.EndBufferIndex();
            return stream.ToArray();
        }