Обработка данных сокета с ведущим значением длины

Это дополнительный вопрос о том, как обрабатывать сообщения с префиксами, полученные из сетевого сокета. Что я пытаюсь сделать, это:

  1. Прочитайте первые 4 байта (которые являются префиксом $ и представляют длину сообщения)
  2. Проверьте, действительно ли префикс $ имеет размер 4 байта и является ли он целым числом
  3. Прочитайте полное сообщение $, используя длину из префикса $
  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

1 ответ

Решение

Вы можете проверить длину полученной двоичной строки, просто используя 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
}
Другие вопросы по тегам