/// <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)); }
/// <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); }