这是关于如何处理从网络套接字接收的前缀消息的后续问题。我想做的是:
- 读取前4个字节(这是$前缀,表示消息的长度)
- 检查$prefix是否真的有4个字节的大小,以及它是否是一个整数
- 使用$prefix的长度读取完整的$message
- 检查消息是否真的有$prefix字节大小
到目前为止,我有以下两行代码:
$prefix = socket_read($socket, 4, PHP_BINARY_READ); //No 1.
//No 2: how to do the checks?
$message = socket_read($socket, $prefix, PHP_BINARY_READ); //No 3.
//No 4: how to do the checks?
我该如何进行上述检查?
附带说明:通过网络套接字连接发送的所有数据都在UTF8中,little-endian
您只需使用strlen
:即可验证收到的二进制字符串的长度
$prefix = socket_read($socket, 4, PHP_BINARY_READ);
if (strlen($prefix) != 4) {
// not 4 bytes long
}
根据您之前的问题,这个二进制字符串表示一个32位长的字符串。按原样解压缩(使用与打包时使用的相同格式说明符),然后获取消息并再次使用strlen
验证长度:
$length = current(unpack('l', $prefix));
$message = socket_read($socket, $length, PHP_BINARY_READ);
if (strlen($message) != $length) {
// $message not the size of $length
}