private void SplitPackets() { Exception exception; try { int index = 0; while (this.m_nRecvBufferSize > this.m_headLengthConverter.VTypeLength) { try { int num2 = (int)((uint)this.m_headLengthConverter.Decode(this.m_recvBuffer, ref index)); if (this.m_nRecvBufferSize >= num2) { int count = (num2 - this.m_headLengthConverter.VTypeLength) - 2; index += 2; byte[] dst = new byte[count]; Buffer.BlockCopy(this.m_recvBuffer, index, dst, 0, count); lock (this.m_recvQueueLocker) { this.m_recvQueue.Enqueue(dst); } this.m_nRecvBufferSize -= num2; index += count; continue; } index -= this.m_headLengthConverter.VTypeLength; } catch (Exception exception1) { exception = exception1; LoggerHelper.Except(exception, null); } break; } Buffer.BlockCopy(this.m_recvBuffer, index, this.m_recvBuffer, 0, this.m_nRecvBufferSize); } catch (Exception exception2) { exception = exception2; LoggerHelper.Except(exception, null); LoggerHelper.Critical("SplitPackets error.", true); this.Close(); } }
/// <summary> /// 从RecvBuffer 中切分出多个Packets, 不足一个 Packet 的部分, 存留在 Buffer 中留待下次Split /// </summary> private void SplitPackets() { try { int offset = 0; while (m_nRecvBufferSize > m_headLengthConverter.VTypeLength) { try { int nLength = (int)(uint)m_headLengthConverter.Decode(m_recvBuffer, ref offset); if (m_nRecvBufferSize >= nLength) { int realLength = nLength - m_headLengthConverter.VTypeLength - RESERVE_SIZE; offset += RESERVE_SIZE; byte[] packet = new byte[realLength]; Buffer.BlockCopy(m_recvBuffer, offset, packet, 0, realLength); lock (m_recvQueueLocker)//此处理为独立线程处理,需加锁,否则会出现丢包 { m_recvQueue.Enqueue(packet); } m_nRecvBufferSize -= nLength; offset += realLength; } else { offset -= m_headLengthConverter.VTypeLength;//m_headLengthConverter.Decode()自带偏移,需要调整偏移 break; } } catch (Exception ex) { LoggerHelper.Except(ex); break; } } // 整理 RecvBuffer, 将buffer 内容前移 Buffer.BlockCopy(m_recvBuffer, offset, m_recvBuffer, 0, m_nRecvBufferSize); } catch (Exception ex) { LoggerHelper.Except(ex); LoggerHelper.Critical("SplitPackets error."); Close(); } }