示例#1
0
        /// <summary>
        /// Parse
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="buffer"></param>
        /// <param name="readlength"></param>
        /// <returns></returns>
        /// <exception cref="BadProtocolException"></exception>
        public ZookResponse Parse(IConnection connection, ArraySegment <byte> buffer, out int readlength)
        {
            if (buffer.Count < 4)
            {
                readlength = 0;
                return(null);
            }

            var payload = buffer.Array;

            //获取message length
            var messageLength = NetworkBitConverter.ToInt32(payload, buffer.Offset);

            readlength = messageLength + 4;
            if (buffer.Count < readlength)
            {
                readlength = 0;
                return(null);
            }

            //首次connect to zk response
            var connectRequest = connection.UserData as Request <ZookResponse>;

            if (connectRequest != null)
            {
                connection.UserData = null;
                var connectResponseBuffer = new byte[messageLength];
                Buffer.BlockCopy(payload, buffer.Offset + 4, connectResponseBuffer, 0, messageLength);
                return(new ZookResponse(connectRequest.SeqID, connectResponseBuffer));
            }

            var xid  = NetworkBitConverter.ToInt32(payload, buffer.Offset + 4);
            var zxid = NetworkBitConverter.ToInt64(payload, buffer.Offset + 8);
            var err  = NetworkBitConverter.ToInt32(payload, buffer.Offset + 16);

            var bodylength = messageLength - 16;

            if (bodylength < 0)
            {
                throw new BadProtocolException("illegality message length.");
            }

            byte[] bodyBytes = null;
            if (bodylength > 0)
            {
                bodyBytes = new byte[bodylength];
                Buffer.BlockCopy(payload, buffer.Offset + 20, bodyBytes, 0, bodyBytes.Length);
            }
            return(new ZookResponse(xid, zxid, (Data.ZoookError)err, bodyBytes));
        }
示例#2
0
        /// <summary>
        /// 解析头部
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="datas"></param>
        /// <param name="count"></param>
        /// <param name="giveupCount"></param>
        /// <returns></returns>
        protected unsafe override bool ParseHeader(Packet _packet, ArraySegment <byte> datas)
        {
            InnerTunnelPacket packet = _packet as InnerTunnelPacket;

            if (packet == null)
            {
                return(false);
            }


            if (datas.Array[datas.Offset] != 0x0d || datas.Array[datas.Offset + 1] != 0x0a)
            {
                return(false);
            }

            packet.ContentLength = NetworkBitConverter.ToInt32(
                datas.Array[datas.Offset + 2],
                datas.Array[datas.Offset + 3],
                datas.Array[datas.Offset + 4],
                datas.Array[datas.Offset + 5]);

            packet.Action         = datas.Array[datas.Offset + 6];
            packet.ClientIdentity = NetworkBitConverter.ToInt64(
                datas.Array[datas.Offset + 7],
                datas.Array[datas.Offset + 8],
                datas.Array[datas.Offset + 9],
                datas.Array[datas.Offset + 10],
                datas.Array[datas.Offset + 11],
                datas.Array[datas.Offset + 12],
                datas.Array[datas.Offset + 13],
                datas.Array[datas.Offset + 14]);

            packet.ServicePort = NetworkBitConverter.ToInt32(
                datas.Array[datas.Offset + 15],
                datas.Array[datas.Offset + 16],
                datas.Array[datas.Offset + 17],
                datas.Array[datas.Offset + 18]);
            return(true);
        }