加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 处理具有前导长度值的套接字数据

发布时间:2020-12-13 17:11:16 所属栏目:PHP教程 来源:网络整理
导读:这是关于如何处理从网络套接字接收的带前缀消息的 follow-up question.我尝试做的是: 读取前4个字节(这是$前缀并表示消息的长度) 检查$prefix是否真的有4个字节的大小,如果它是一个整数 使用$prefix的长度读取完整的$message 检查消息是否确实具有$prefix字
这是关于如何处理从网络套接字接收的带前缀消息的 follow-up question.我尝试做的是:

>读取前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,PHP_BINARY_READ);
if (strlen($prefix) != 4) {
    // not 4 bytes long
}

根据您之前的问题,此二进制字符串表示32位长. Unpack就这样(使用与打包时相同的格式说明符),然后获取消息并再次使用strlen来验证长度:

$length = current(unpack('l',$prefix));
$message = socket_read($socket,$length,PHP_BINARY_READ);
if (strlen($message) != $length) {
    // $message not the size of $length
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读