open_length_check
最后更新于:2022-04-02 06:22:16
# 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,
));
~~~
';