libhv
libhv copied to clipboard
remove assert in hio_set_unpack
协议报文本身多变,body长度的字段 可能在 body_offset之后。所以这里的assert是不正常的提示。 例如,报文是 [0xff, 0xff, 0x3, 0x2(长度字段), 0xA], 前两个字节是head,0x3是类型,0x2是body_len(0x3和0x2两个字节),0xA是校验位 设置时候,body_offset= 2,length_field_offset= 3,length_field_bytes=1, length_adjustment= 1。 这里与assert相悖,所以应该去除assert语句。
协议报文本身多变,body长度的字段 可能在 body_offset之后。所以这里的assert是不正常的提示。 例如,报文是 [0xff, 0xff, 0x3, 0x2(长度字段), 0xA], 前两个字节是head,0x3是类型,0x2是body_len(0x3和0x2两个字节),0xA是校验位 设置时候,body_offset= 2,length_field_offset= 3,length_field_bytes=1, length_adjustment= 1。 这里与assert相悖,所以应该去除assert语句。
body之前的都应该当做head来设置,即 body_offset=5, length_field_offset= 3,length_field_bytes=1, length_adjustment= -2
这种计算方式,对使用者来说,要求有点高。必须先理解这4-5个字段的含义后,才能正确使用。感觉还是有改进的空间。特别是length_adjustment 可以为负值这点。 另外,一定要设置这个assert的目的是什么呢?如果按照上例的配置方式,有何不妥之处呢?
这种计算方式,对使用者来说,要求有点高。必须先理解这4-5个字段的含义后,才能正确使用。感觉还是有改进的空间。特别是length_adjustment 可以为负值这点。 另外,一定要设置这个assert的目的是什么呢?如果按照上例的配置方式,有何不妥之处呢?
hio_unpack_by_length_field里是通过判断收到body_offset字节,即收到整个头部,才开始从头部解析出长度,然后收完body才回调,所以上面assert断言头部长度字段是包含在头部里的,如果不是,则不适用于这个拆包规则。
length_adjustment为负也很常见,有些协议里头部长度字段表示head+body的总长度,此时可以把length_adjustment设置为-body_offset,即减去head的长度。
至于掌握这些字段含义是必须的,也是参考了netty,见https://github.com/netty/netty/blob/4.1/codec/src/main/java/io/netty/handler/codec/LengthFieldBasedFrameDecoder.java
- lengthFieldOffset = 0
- lengthFieldLength = 2
- lengthAdjustment = -2 (= the length of the Length field)
- initialBytesToStrip = 0
netty中的 “initialBytesToStrip ”比较容易理解。目前咱们代码中是header和body来区分字段,这两个字段含义可能会理解不一样。 想了两天,能比较容易的接受这种方式了。:)
BTW:作者有相关的群吗?可以讨论libhv一些技术细节的地方,想多请教请教!
QQ技术交流群:739352073