/// <summary> /// 解析数据 /// </summary> protected override void ParseData() { MoByteBuffer bb = new MoByteBuffer(_bytes); int tabLine = 0; const int headMarkAndSize = 6; while (bb.IsReadable(headMarkAndSize)) { //检测行标记 short tabHead = bb.ReadShort(); if (tabHead != ResDefine.TabStreamHead) { string message = string.Format("Table stream head is invalid. File is {0} , tab line is {1}", _path, tabLine); throw new Exception(message); } //检测行大小 int tabSize = bb.ReadInt(); if (!bb.IsReadable(tabSize) || tabSize > ResDefine.TabStreamMaxLen) { string message = string.Format("Table stream size is invalid. File is {0}, tab line {1}", _path, tabLine); throw new Exception(message); } //读取行内容 MoCfgTab tab = null; try { tab = ReadTab(bb); } catch (Exception ex) { string message = string.Format("ReadTab falied. File is {0}, tab line {1}. Error : ", _path, tabLine, ex.ToString()); throw new Exception(message); } ++tabLine; //检测是否重复 if (_tabs.ContainsKey(tab.Id)) { string message = string.Format("The tab key is already exist. Type is {0}, file is {1}, key is {2}", this.GetType(), _path, tab.Id); throw new Exception(message); } else { _tabs.Add(tab.Id, tab); } } }
/// <summary> /// 数据接收完成时 /// </summary> private void ProcessReceive(object obj) { SocketAsyncEventArgs e = obj as SocketAsyncEventArgs; // check if the remote host closed the connection if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { _receiveBuffer.WriterIndex += e.BytesTransferred; //如果数据写穿 if (_receiveBuffer.WriterIndex > _receiveBuffer.Capacity) { HandleError(true, "The channel fatal error"); return; } //循环解包 while (true) { //如果数据不够一个包头 if (_receiveBuffer.ReadableBytes() < NetDefine.PackageHeadSize) { break; } _receiveBuffer.MarkReaderIndex(); //如果包头标记不正确 Int16 headMark = _receiveBuffer.ReadShort(); if (headMark != NetDefine.PackageHeadMark) { _receiveBuffer.ResetReaderIndex(); _receiveBuffer.ReaderIndex++; continue; } //获取包体信息 Int16 msgType = _receiveBuffer.ReadShort(); Int32 msgSize = _receiveBuffer.ReadInt(); int remainHeadSize = NetDefine.PackageHeadSize - 2 - 2 - 4; for (int i = 0; i < remainHeadSize; i++) { _receiveBuffer.ReadByte(); } //如果协议大小超过最大长度 if (msgSize > NetDefine.PackageMaxSize) { HandleError(false, "The package {0} size is exceeds max size.", msgType); _receiveBuffer.ResetReaderIndex(); _receiveBuffer.ReaderIndex++; continue; } //如果剩余可读数据小于包体长度 if (msgSize > 0 && _receiveBuffer.ReadableBytes() < msgSize) { _receiveBuffer.ResetReaderIndex(); break; //需要退出读够数据再解包 } //正常解包 try { _receiveBuffer.ResetReaderIndex(); IPackage msg = MoNetMsgHandler.Handle(msgType); msg.Decode(_receiveBuffer, _tempRBuffer); lock (_receiveQueue) { _receiveQueue.Enqueue(msg); } } catch (Exception ex) { // 解包异常后继续解包 HandleError(false, "The package {0} decode error : {1}", msgType, ex.ToString()); _receiveBuffer.ResetReaderIndex(); _receiveBuffer.ReaderIndex++; } } //while end //将剩余数据移至起始 _receiveBuffer.DiscardReadBytes(); //为接收下一段数据,投递接收请求 e.SetBuffer(_receiveBuffer.WriterIndex, _receiveBuffer.WriteableBytes()); bool willRaiseEvent = IOSocket.ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e); } } else { HandleError(true, "ProcessReceive error : {0}", e.SocketError); } }