public bool ProcessReceiveBuffer(byte[] receiveBuffer, int offset, int count)
 {
     while (count > 0)
     {
         if (needReceivePacketLenght == 0)
         {
             //按照长度分包
             needReceivePacketLenght = BitConverter.ToInt32(receiveBuffer, offset); //获取包长度
             if (NetByteOrder)
             {
                 needReceivePacketLenght = IPAddress.NetworkToHostOrder(needReceivePacketLenght); //把网络字节顺序转为本地字节顺序
             }
             offset += intByteLength;
             count  -= intByteLength;
         }
         if (count == 0)
         {
             break;
         }
         if (count > needReceivePacketLenght)
         {
             ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, needReceivePacketLenght);
             offset += needReceivePacketLenght;
             count  -= needReceivePacketLenght;
             ReceiveData();
         }
         else if (count == needReceivePacketLenght)
         {
             ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, needReceivePacketLenght);
             ReceiveData();
             break;
         }
         else
         {
             ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, count);
             needReceivePacketLenght -= count;
             break;
         }
     }
     return(true);
 }
示例#2
0
 public void ReceiveData()
 {
     Session.Pool.RUdpServer.OnReceived(Session, ReceiveDataBuffer);
     ReceiveDataBuffer.Clear();//清空数据接收器缓存
 }
示例#3
0
        private void ProcessReceiveQueue()
        {
            RUdpBuffer buffer;

            if (!receiveQueue.TryDequeue(out buffer))
            {
                isReceive = false;
                return;
            }
            byte[] receiveBuffer = buffer.FixedBuffer.Buffer;
            int    offset        = buffer.Offset;
            int    count         = buffer.Count;

            while (count > 0)
            {
                if (needReceivePacketLenght > 0 && alreadyReceivePacketLength + count >= needReceivePacketLenght)//说明包已获取完成
                {
                    if (InterimPacketBuffer != null)
                    {
                        ReceiveBuffers.Enqueue(InterimPacketBuffer);
                        InterimPacketBuffer = null;
                    }
                    if (ReceiveBuffers.Count > 0)
                    {
                        int getLenght = 0;//已取出数据

                        var cacheBuffer = ReceiveBuffers.Dequeue();
                        getLenght = cacheBuffer.DataSize - uIntByteLength;
                        ReceiveDataBuffer.WriteBuffer(cacheBuffer.Buffer, uIntByteLength, getLenght);
                        Session.Pool.FixedBufferPool.Push(cacheBuffer);
                        while (ReceiveBuffers.Count > 0)
                        {
                            var popBuffer = ReceiveBuffers.Dequeue();
                            ReceiveDataBuffer.WriteBuffer(popBuffer.Buffer, 0, popBuffer.DataSize);
                            getLenght += popBuffer.DataSize;
                            Session.Pool.FixedBufferPool.Push(popBuffer);
                        }
                        var needLenght = needReceivePacketLenght - getLenght - uIntByteLength;
                        ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, needLenght);
                        offset += needLenght;
                        count  -= needLenght;
                        //触发获取指令事件
                        ReceiveData();
                        //清理合包数据
                        needReceivePacketLenght = 0; alreadyReceivePacketLength = 0;
                    }
                }
                else
                {
                    if (InterimPacketBuffer != null && alreadyReceivePacketLength == 0)
                    {
                        var diff = uIntByteLength - InterimPacketBuffer.DataSize;
                        InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, diff);
                        offset += diff;
                        count  -= diff;
                        var packetLength = BitConverter.ToInt32(InterimPacketBuffer.Buffer, 0);
                        if (NetByteOrder)
                        {
                            packetLength = IPAddress.NetworkToHostOrder(packetLength); //把网络字节顺序转为本地字节顺序
                        }
                        if (count >= packetLength)
                        {
                            Session.Pool.FixedBufferPool.Push(InterimPacketBuffer);
                            InterimPacketBuffer = null;
                            ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, packetLength);
                            ReceiveData();
                            offset += packetLength;
                            count  -= packetLength;
                        }
                        else
                        {
                            needReceivePacketLenght    = packetLength + uIntByteLength;
                            alreadyReceivePacketLength = uIntByteLength;
                        }
                    }
                }
                if (needReceivePacketLenght > 0)
                {
                    while (count > 0)//遍历把数据放入缓冲器中
                    {
                        if (InterimPacketBuffer == null)
                        {
                            InterimPacketBuffer = Session.Pool.FixedBufferPool.Pop();
                        }
                        var surpos = InterimPacketBuffer.Buffer.Length - InterimPacketBuffer.DataSize;//中间buffer剩余空间
                        if (count > surpos)
                        {
                            InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, surpos);
                            ReceiveBuffers.Enqueue(InterimPacketBuffer);
                            InterimPacketBuffer         = null;
                            alreadyReceivePacketLength += surpos;//记录已接收的数据
                            offset += surpos;
                            count  -= surpos;
                        }
                        else
                        {
                            InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, count);
                            alreadyReceivePacketLength += count;//记录已接收的数据
                            count = 0;
                        }
                    }
                }
                else
                {
                    if (count >= uIntByteLength)
                    {
                        //按照长度分包
                        int packetLength = BitConverter.ToInt32(receiveBuffer, offset); //获取包长度
                        if (NetByteOrder)
                        {
                            packetLength = IPAddress.NetworkToHostOrder(packetLength); //把网络字节顺序转为本地字节顺序
                        }
                        if (packetLength < 0)
                        {
                            var ddd = packetLength;
                        }
                        if ((count - uIntByteLength) >= packetLength) //如果数据包达到长度则马上进行解析
                        {
                            ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset + uIntByteLength, packetLength);
                            //触发获取指令事件
                            ReceiveData();
                            int processLenght = packetLength + uIntByteLength;
                            offset += processLenght;
                            count  -= processLenght;
                        }
                        else
                        {
                            needReceivePacketLenght = packetLength + uIntByteLength;//记录当前包总共需要多少的数据
                        }
                    }
                    else
                    {
                        if (InterimPacketBuffer == null)
                        {
                            InterimPacketBuffer = Session.Pool.FixedBufferPool.Pop();
                        }
                        InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, count);
                        count = 0;
                    }
                }
            }
            Session.Pool.RUdpServer.BufferPool.Push(buffer.FixedBuffer);//把缓冲块放入池中
            ProcessReceiveQueue();
        }
 public void ReceiveData()
 {
     Session.OnReceived(Session, ReceiveDataBuffer);
     ReceiveDataBuffer.Clear();//清空数据接收器缓存
     needReceivePacketLenght = 0;
 }
        public bool ProcessReceiveBuffer(byte[] receiveBuffer, int offset, int count)
        {
            while (count > 0)
            {
                if (needReceivePacketLenght > 0 && alreadyReceivePacketLength + count >= needReceivePacketLenght)//说明包已获取完成
                {
                    if (InterimPacketBuffer != null)
                    {
                        ReceiveBuffers.Enqueue(InterimPacketBuffer);
                        InterimPacketBuffer = null;
                    }
                    if (ReceiveBuffers.Count > 0)
                    {
                        int getLenght = 0;//已取出数据

                        var cacheBuffer = ReceiveBuffers.Dequeue();
                        getLenght = cacheBuffer.DataSize - intByteLength;
                        ReceiveDataBuffer.WriteBuffer(cacheBuffer.Buffer, intByteLength, getLenght);
                        BufferPool.Push(cacheBuffer);
                        while (ReceiveBuffers.Count > 0)
                        {
                            var popBuffer = ReceiveBuffers.Dequeue();
                            ReceiveDataBuffer.WriteBuffer(popBuffer.Buffer, 0, popBuffer.DataSize);
                            getLenght += popBuffer.DataSize;
                            BufferPool.Push(popBuffer);
                        }
                        var needLenght = needReceivePacketLenght - getLenght - intByteLength;
                        ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, needLenght);
                        offset += needLenght;
                        count  -= needLenght;
                        //触发获取指令事件
                        ReceiveData();
                        //清理合包数据
                        needReceivePacketLenght = 0; alreadyReceivePacketLength = 0;
                    }
                }
                else
                {
                    if (InterimPacketBuffer != null && alreadyReceivePacketLength == 0)
                    {
                        var diff = intByteLength - InterimPacketBuffer.DataSize;
                        InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, diff);
                        offset += diff;
                        count  -= diff;
                        var packetLength = BitConverter.ToInt32(InterimPacketBuffer.Buffer, 0);
                        if (NetByteOrder)
                        {
                            packetLength = IPAddress.NetworkToHostOrder(packetLength); //把网络字节顺序转为本地字节顺序
                        }
                        if (count >= packetLength)
                        {
                            BufferPool.Push(InterimPacketBuffer);
                            InterimPacketBuffer = null;
                            ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset, packetLength);
                            ReceiveData();
                            offset += packetLength;
                            count  -= packetLength;
                        }
                        else
                        {
                            needReceivePacketLenght    = packetLength + intByteLength;
                            alreadyReceivePacketLength = intByteLength;
                        }
                    }
                }
                if (needReceivePacketLenght > 0)
                {
                    while (count > 0)//遍历把数据放入缓冲器中
                    {
                        if (InterimPacketBuffer == null)
                        {
                            InterimPacketBuffer = BufferPool.Pop();
                        }
                        var surpos = InterimPacketBuffer.Buffer.Length - InterimPacketBuffer.DataSize;//中间buffer剩余空间
                        if (count > surpos)
                        {
                            InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, surpos);
                            ReceiveBuffers.Enqueue(InterimPacketBuffer);
                            InterimPacketBuffer         = null;
                            alreadyReceivePacketLength += surpos;//记录已接收的数据
                            offset += surpos;
                            count  -= surpos;
                        }
                        else
                        {
                            InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, count);
                            alreadyReceivePacketLength += count;//记录已接收的数据
                            count = 0;
                        }
                    }
                }
                else
                {
                    if (count > intByteLength)
                    {
                        //按照长度分包
                        int packetLength = BitConverter.ToInt32(receiveBuffer, offset); //获取包长度
                        if (NetByteOrder)
                        {
                            packetLength = IPAddress.NetworkToHostOrder(packetLength); //把网络字节顺序转为本地字节顺序
                        }
                        if ((count - intByteLength) >= packetLength)                   //如果数据包达到长度则马上进行解析
                        {
                            ReceiveDataBuffer.WriteBuffer(receiveBuffer, offset + intByteLength, packetLength);
                            //触发获取指令事件
                            ReceiveData();
                            int processLenght = packetLength + intByteLength;
                            offset += processLenght;
                            count  -= processLenght;
                        }
                        else
                        {
                            needReceivePacketLenght = packetLength + intByteLength;//记录当前包总共需要多少的数据
                        }
                    }
                    else
                    {
                        if (InterimPacketBuffer == null)
                        {
                            InterimPacketBuffer = BufferPool.Pop();
                        }
                        InterimPacketBuffer.WriteBuffer(receiveBuffer, offset, count);
                        count = 0;
                    }
                }
            }
            return(count == 0);
        }