Пример #1
0
        public static Message FromIOBuffer(IoBuffer inBuf, int dataLen)
        {
            var msg = get();

            do
            {
                if (dataLen < 12)
                {
                    break;
                }
                else
                {
                    dataLen -= 12;
                }
                msg.m_module  = inBuf.ReadInt32();
                msg.m_command = inBuf.ReadInt32();
                msg.m_flag    = inBuf.ReadInt32();
                //如果是回应消息,就要提取错误码
                if ((msg.m_flag & MSG_FLAG_RESPONSE) != 0)
                {
                    if (dataLen < 4)
                    {
                        break;
                    }
                    else
                    {
                        dataLen -= 4;
                    }
                    msg.m_code = inBuf.ReadInt32();
                }
                else
                {
                    msg.m_code = 0;
                }
                //如果有错误消息,就要提取错误消息
                if ((msg.m_flag & MSG_FLAG_ERR_MSG) != 0)
                {
                    if (dataLen < 4)
                    {
                        break;
                    }
                    else
                    {
                        dataLen -= 4;
                    }
                    var len = inBuf.ReadInt32();
                    if (len < 0 || dataLen < len)
                    {
                        break;
                    }
                    else
                    {
                        dataLen -= len;
                    }
                    msg.m_msg = inBuf.ReadOnlyStr(len);
                }
                else
                {
                    msg.m_msg = null;
                }
                //有消息体?
                if (dataLen > 0)
                {
                    var bodyBuf = new IoBuffer(dataLen);
                    inBuf.Read(bodyBuf, dataLen);
                    msg.m_body = bodyBuf;
                }
                else
                {
                    msg.m_body = null;
                }
                return(msg);
            }while (false);

            //对象放回池里
            put(msg);
            //能到这里来?那说明前面遇到break,说明数据不够长
            Util.SafeLogError("Message~fromIOBuffer数据不够长");
            //跳过还未读的
            inBuf.Skip(dataLen);
            //返回null
            return(null);
        }