/// <summary> /// The parse byte package. /// </summary> /// <param name="dataPipe"> /// The data pipe. /// </param> /// <param name="remoteEndPoint"> /// The remote end point. /// </param> /// <param name="maxPacketSize"> /// The max packet size. /// </param> internal void ParseBytePackage(Pipe dataPipe, EndPoint remoteEndPoint, int maxPacketSize) { var remoteAddress = remoteEndPoint.ToString(); uint readedBytes = 0; ushort cmdId, dataType; uint payloadSize, dataCount, param1, param2; byte[] payload = null; byte[] header = null; while (maxPacketSize == 0 || maxPacketSize >= (readedBytes + 16)) { header = dataPipe.Read(16); // Pipe destroyed if (header.Length == 0) { return; } cmdId = NetworkByteConverter.ToUInt16(header, 0); payloadSize = NetworkByteConverter.ToUInt16(header, 2); dataType = NetworkByteConverter.ToUInt16(header, 4); param1 = NetworkByteConverter.ToUInt32(header, 8); param2 = NetworkByteConverter.ToUInt32(header, 12); if (payloadSize == 0xFFFF) { payloadSize = NetworkByteConverter.ToUInt32(dataPipe.Read(4)); dataCount = NetworkByteConverter.ToUInt32(dataPipe.Read(4)); readedBytes += payloadSize + 24; } else { dataCount = NetworkByteConverter.ToUInt16(header, 6); readedBytes += payloadSize + 16; } payload = dataPipe.Read((int)payloadSize); this.HandleMessage( cmdId, dataType, ref payloadSize, ref dataCount, ref param1, ref param2, ref header, ref payload, ref remoteEndPoint); } }