public byte[] Serialize() { int totalLen = Legth + RUDP_HEADER_LENGTH; var bs = RSocketUtils.CreateArray <byte>(totalLen); Stream stream = new MemoryStream(bs); var bW = new BinaryWriter(stream); bW.Seek(0, SeekOrigin.Begin); bW.Write(Protcol); bW.Write(CRC); bW.Write(Session); bW.Write((byte)Type); bW.Write(MsgNum); bW.Write(ACK); bW.Write(Piece); bW.Write(Legth); bW.Write(rawData, offset, len); CRC = RSocketUtils.CalcCrc16(bs, 3, totalLen - 3); bW.Seek(1, SeekOrigin.Begin); bW.Write(CRC); bW.Close(); return(bs); }
private void TryMergePiecePacket() { int curNumIndex = getMsgNumPacketByPieceQeue(CurRecvNum); if (curNumIndex < 0) { return; } int nextNumIndex = getMsgNumPacketByPieceQeue(DesireNextMsgNum); if (nextNumIndex < 0) { return; } var curPacket = recvPiecesBuff[curNumIndex]; var nextPacket = recvPiecesBuff[nextNumIndex]; curPacket.Append(nextPacket); CurRecvNum = DesireNextMsgNum; curPacket.MsgNum = CurRecvNum; curPacket.Piece--; RSocketUtils.ListRemoveAt <NetPacket>(recvPiecesBuff, nextNumIndex); nextPacket.GC(); if (curPacket.Piece <= 1) { recvQueue.Enqueue(curPacket); RSocketUtils.ListRemoveAt <NetPacket>(recvPiecesBuff, CurRecvNum); curPacket.GC(); return; } TryMergePiecePacket(); }
private void CheckBuffQueue() { int index = -1; for (int i = 0; i < recvBuff.Count; i++) { if (isExpectRecvMsgNum(recvBuff[i].MsgNum)) { index = i; break; } } if (index != -1) { CurRecvNum++; recvQueue.Enqueue(recvBuff[index]); RSocketUtils.ListRemoveAt <NetPacket>(recvBuff, index); CheckBuffQueue(); } }
private bool CheckMsg(byte[] data, int offset, int len) { //Protocol Check var br = new BinaryReader(new MemoryStream(data, offset, len - offset)); byte protocol = br.ReadByte(); bool isProtocol = PROTOCOL == protocol; if (!isProtocol) { return(isProtocol); } //CRC Check int crcOffset = offset + CRC_OFFSET; UInt16 _crc = RSocketUtils.CalcCrc16(data, crcOffset, len - CRC_OFFSET); var msgCRC = br.ReadUInt16(); bool isCRC = msgCRC == _crc; //Repeat Check return(isCRC); }