Process socket data with a leading length value

孤街醉人 提交于 2019-12-12 12:12:54

问题


This is a follow-up question about how to process prefixed messages received from a network socket. What I try to do is:

  1. Read the first 4 bytes (which is the $prefix and represents the length of the message)
  2. Check if $prefix has really the size of 4 bytes and if it's an integer
  3. Read the complete $message using the length from $prefix
  4. Check if message has really the size of $prefix bytes

So far I've the following two lines of code:

    $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?

How can I do the mentioned checks?

A little side note: all data sent through the network socket connection is in UTF8, little-endian


回答1:


You can validate the length of the binary string you have received by simply using strlen:

$prefix = socket_read($socket, 4, PHP_BINARY_READ);
if (strlen($prefix) != 4) {
    // not 4 bytes long
}

According to your previous question, this binary string represents a 32-bit long. Unpack it as such (with the same format specifier you use when pack-ing it), then fetch the message and use strlen again to validate the length:

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


来源:https://stackoverflow.com/questions/9746661/process-socket-data-with-a-leading-length-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!