libhv icon indicating copy to clipboard operation
libhv copied to clipboard

remove assert in hio_set_unpack

Open dubw opened this issue 2 years ago • 5 comments

协议报文本身多变,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语句。

dubw avatar Aug 19 '22 09:08 dubw

协议报文本身多变,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

ithewei avatar Aug 19 '22 13:08 ithewei

这种计算方式,对使用者来说,要求有点高。必须先理解这4-5个字段的含义后,才能正确使用。感觉还是有改进的空间。特别是length_adjustment 可以为负值这点。 另外,一定要设置这个assert的目的是什么呢?如果按照上例的配置方式,有何不妥之处呢?

dubw avatar Aug 19 '22 15:08 dubw

这种计算方式,对使用者来说,要求有点高。必须先理解这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

ithewei avatar Aug 20 '22 04:08 ithewei

  • lengthFieldOffset = 0
  • lengthFieldLength = 2
  • lengthAdjustment = -2 (= the length of the Length field)
  • initialBytesToStrip = 0

netty中的 “initialBytesToStrip ”比较容易理解。目前咱们代码中是header和body来区分字段,这两个字段含义可能会理解不一样。 想了两天,能比较容易的接受这种方式了。:)

BTW:作者有相关的群吗?可以讨论libhv一些技术细节的地方,想多请教请教!

dubw avatar Aug 22 '22 00:08 dubw

QQ技术交流群:739352073

ithewei avatar Aug 22 '22 02:08 ithewei