示例#1
0
        // --- Private Function ---------------------------------------------------------------------------------------------------------------------------------------------- //

        // 解析消息
        private void ParseMessage()
        {
            int receiveCount = InnerSocket.Receive(ReceiveBuffer, InnerSocket.Available > BufferSize ? BufferSize : InnerSocket.Available, SocketFlags.None);
            int bufferOffset = 0;

            while (true)
            {
                if (bufferOffset == receiveCount)
                {
                    break;
                }
                if (ReceivingMessageHeaderPos != 6)
                {
                    // 读取消息头
                    if (receiveCount - bufferOffset >= 6 - ReceivingMessageHeaderPos)
                    {
                        // 数据充足
                        Array.Copy(ReceiveBuffer, bufferOffset, ReceivingMessageHeader, ReceivingMessageHeaderPos, 6 - ReceivingMessageHeaderPos);
                        bufferOffset += 6 - ReceivingMessageHeaderPos;
                        ReceivingMessageHeaderPos    = 6;
                        ReceivingMessageExpectLength = BitConverter.ToInt32(ReceivingMessageHeader, 2);
                        if (ReceivingMessageExpectLength < 0)
                        {
                            Disconnect();
                            return;
                        }
                        ReceivingMessage = ReceivingMessageExpectLength > 0 ? new SocketMessage() : new SocketMessage(false);   // 性能优化, 空消息不拉取缓冲区
                        ReceivingMessage.Info.InternalProtocol = BitConverter.ToUInt16(ReceivingMessageHeader, 0);
                    }
                    else
                    {
                        // 数据不足
                        Array.Copy(ReceiveBuffer, bufferOffset, ReceivingMessageHeader, ReceivingMessageHeaderPos, receiveCount - bufferOffset);
                        ReceivingMessageHeaderPos += receiveCount - bufferOffset;
                        break;
                    }
                }
                else
                {
                    // 读取消息内容
                    if (receiveCount - bufferOffset >= ReceivingMessageExpectLength - ReceivingMessage.Length)
                    {
                        // 数据充足
                        if (ReceivingMessageExpectLength > 0)
                        {
                            bufferOffset += ReceivingMessage.CopyFromBytes(ReceiveBuffer, bufferOffset, ReceivingMessageExpectLength - ReceivingMessage.Length);
                        }
                        ReceivingMessage.Info.InternalChannel = ParentChannel.ChannelIndex;
                        ReceivingMessage.Info.Status          = SocketMessageStatus.Received;
                        ReceivingMessage.Position             = 0;
                        ReceiveMessageQueue.Add(ReceivingMessage);
                        ReceivingMessage          = null;
                        ReceivingMessageHeaderPos = 0;
                    }
                    else
                    {
                        // 数据不足
                        ReceivingMessage.CopyFromBytes(ReceiveBuffer, bufferOffset, receiveCount - bufferOffset);
                        break;
                    }
                }
            }
        }