Exemple #1
0
        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();
            }
        }
Exemple #2
0
 /// <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();
     }
 }