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