助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
# open\_length\_check [TOC] 打开包长检测特性。包长检测提供了固定包头+包体这种格式协议的解析。启用后,可以保证`Worker`进程`onReceive`每次都会收到一个完整的数据包。 > 长度检测协议,只需要计算一次长度,数据处理仅进行指针偏移,**性能非常高,推荐使用** ## 参数类型 * 布尔型,必须传入`true`或`false`,其他类型将被强制转换为布尔型 长度协议提供了`3`个选项来控制协议细节。 > 此配置仅对`STREAM`类型的`Socket`有效,如`TCP`、`Unix Socket Stream` ## package\_length\_type 包头中某个字段作为包长度的值,底层支持了`10`种长度类型。请参考[package\_length\_type](package\_length\_type.md) ## package\_body\_offset 从第几个字节开始计算长度,一般有2种情况: * `length`的值包含了整个包(包头+包体),`package_body_offset`为`0` * 包头长度为`N`字节,`length`的值不包含包头,仅包含包体,`package_body_offset`设置为`N` ## package\_length\_offset `length`长度值在包头的第几个字节。 ### 示例: ~~~ struct { uint32_t type; uint32_t uid; uint32_t length; uint32_t serid; char body[0]; } ~~~ 以上通信协议的设计中,包头长度为`4`个整型,`16`字节,`length`长度值在第`3`个整型处。因此`package_length_offset`设置为`8`,`0-3`字节为`type`,`4-7`字节为`uid`,`8-11`字节为`length`,`12-15`字节为`serid`。 ~~~ $server->set(array( 'open_length_check' => true, 'package_max_length' => 81920, 'package_length_type' => 'N', 'package_length_offset' => 8, 'package_body_offset' => 16, )); ~~~