// --- 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; } } } }