Обработка данных сокета с ведущим значением длины
Это дополнительный вопрос о том, как обрабатывать сообщения с префиксами, полученные из сетевого сокета. Что я пытаюсь сделать, это:
- Прочитайте первые 4 байта (которые являются префиксом $ и представляют длину сообщения)
- Проверьте, действительно ли префикс $ имеет размер 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
}