2014-11-17 3 views
1

Мне нужна помощь, пожалуйста, у меня проблема с чтением двоичных данных, отправленных устройством через сокет. Я не смог получить точные данные, которые были отправлены. Я использую этот кодPHP_NORMAL_READ отрезание отправляемых данных

$data = @socket_read($read_sock,2048,PHP_NORMAL_READ); 

Я использую PHP_NORMAL_READ, потому что он прекратит чтение с этим «\ г \ п».

но когда я получу, данные не точны, он получает только несколько двоичных данных.

+0

Удалить это '@'! Затем установите 'error_reporing (E_ALL);' и 'ini_set ('display_errors', 1);' и сообщите нам, что он показывает. – vaso123

ответ

1

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

  • меньше или точно «длина» байт
  • по крайней мере один байт
  • нет " \ r 'или' \ n 'в ответе, если только это не единственный символ

Большинство API-интерфейсов Socket, с которыми вы сталкиваетесь, работают таким образом, они могут дать вам меньше байтов, чем запрошено, поскольку больше байтов может не быть доступный, и данные могут поступать в меньшие части, чем устройство, отправленное им. Решение должно считываться с t он сокет повторно, пока вы не получите то, что хотите (это означает, что до тех пор, пока вы не получите строку, заканчивающуюся символом новой строки, в вашем случае).

Вы также можете обратиться к http://php.net/manual/en/function.socket-read.php, где комментаторы предполагают, что функции используются с ошибкой при использовании с PHP_NORMAL_READ. Возможно, стоит искать некоторую библиотеку сокетов для PHP, которая поддерживает readLine.

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