Обработка данных сокета с ведущим значением длины - PullRequest
4 голосов
/ 17 марта 2012

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

  1. Считать первые 4 байта (это префикс $ и представляет длину сообщения)
  2. Проверить, действительно ли префикс $ имеет размер4 байта и если это целое число
  3. Прочитать полное сообщение $, используя длину из префикса $
  4. Проверить, действительно ли сообщение имеет размер байта префикса $

До сих пор у меня есть следующие две строки кода:

    $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 Ответ

4 голосов
/ 18 марта 2012

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