/// <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);
                }
            }
        }
Beispiel #2
0
        /// <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);
            }
        }