libhv
libhv copied to clipboard
hio_unpack_by_length_field()对length_adjustment成员的处理是否应该改成减去
最近使用libhv测试IPV4报文拆包,发现拆分后的报文异常,设置如下: //拆包规则 unpack_setting_t protorpc_unpack_setting; memset(&protorpc_unpack_setting, 0, sizeof(unpack_setting_t)); protorpc_unpack_setting.mode = UNPACK_BY_LENGTH_FIELD; protorpc_unpack_setting.package_max_length = 16000; protorpc_unpack_setting.body_offset = 20; protorpc_unpack_setting.length_field_offset = 2; protorpc_unpack_setting.length_field_bytes = 2; protorpc_unpack_setting.length_field_coding = ENCODE_BY_BIG_ENDIAN; cli.setUnpack(&protorpc_unpack_setting); 分析libhv代码发现hio_unpack_by_length_field()里实际header和body加起来才是package_len,IPv4的头部字段的长度实际是整个报文长度,这样就会实际超出真实的数据长度; libhv原生代码是 package_len = head_len + body_len + setting->length_adjustment; 如果修改成 package_len = head_len + body_len - setting->length_adjustment; 这样不管head携带的长度是否是整个报文长度,都能正确解析。