5

这是关于如何处理从网络套接字接收到的前缀消息的后续问题。我尝试做的是:

  1. 读取前 4 个字节(即 $prefix,代表消息的长度)
  2. 检查 $prefix 是否真的有 4 个字节的大小以及它是否是一个整数
  3. 使用 $prefix 的长度读取完整的 $message
  4. 检查消息是否真的有 $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

4

1 回答 1

5

您可以通过简单地使用来验证您收到的二进制字符串的长度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
}
于 2012-03-18T04:30:57.987 回答