2012-03-17 2 views
4

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

  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, прямой порядок байтов

ответ

4

Вы можете проверить длину двоичной строки, которую вы получили, просто используя strlen:

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

Согласно вашему предыдущему вопросу, эта двоичная строка представляет собой 32-разрядную длину. Unpack это как таковые (с тем же спецификатором формата используется при паке-кий его), а затем извлечь сообщение и использовать strlen еще раз для проверки длины:

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

Еще раз спасибо за вашу помощь, действительно ценю это. Чтобы проверить, является ли префикс $ целым числом, я должен проверить неустановленное значение в $ length (is_int ($ length)), правильно ли это? – Mike

+0

@Mike: 'unpack' вернет' false', если '$ prefix' не соответствует указанному формату (в приведенном выше примере 32-битная подпись длинна,' l'). Если unpack возвращает что-либо, кроме 'false', вам не нужно проверять' is_int'. – netcoder

+0

спасибо, работает отлично! – Mike

 Смежные вопросы

  • Нет связанных вопросов^_^