Чтение из сокета

young

Новичок
Чтение из сокета

имею большой опыт работы с сокетами, но вот возникла проблема.

OS: Linux
Php: 4.3.2

На машине запущен некий с-шный демон, с которым мне приходится общаться через сокет. Я открываю его через fsockopen и все нормально, но!

Когда этот демон хочет мне нечто сказать, он выплевывает это мне в сокет без никаких маркировок: ни конца строки, ни конца потока, ничего. Вывод у него многострочный.

Проблема в тоим, что бы определить что он мне ответил. так как feof не работает.
Если мне в ответ было выплюнуто 2 строки, они будут считаны нормально, но при попытке прочитать третью, php умирает.
Я заранее не знаю сколько строк мне вернули

PHP:
while (!feof ($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
}
такой вариант просто зависает
 

deek

Новичок
нужно неблокирующее чтение (socket_set_blocking).

строчка "fgets($handle, 4096);" при блокирующем чтении означает "прочитать 4096 байт", а при неблокирующем - "прочитать все, что есть в сокете, но не более чем 4096 байт".

именно поэтому при блокирующем чтении пхп "виснет", ожидая либо еще данных из сокета либо EOF. Если нет EOF, то прочитав 2048 байт в очередном шаге, следующие 2048 он будет ждать бесконечно.

думается, что при неблокирующем чтении ты сможешь отловить конец сообщения по наличию в $buffer большого количества \0.
[добавление]
хотя, могут быть и пробелы. не пробовал.
[/добавление]
 

deek

Новичок
> без никаких маркировок: ни конца строки,
> Вывод у него многострочный.
тут надо определиться.
вообще, что отвечает демон? текст? бинарные сообщения?

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

young

Новичок
вообще, что отвечает демон? текст? бинарные сообщения?
Текст
в любом случае, если он пишет в сокет несколько сообщений, то они же должны как-то разделяться (метка заголовка/метка конца сообщения).
Скажем так, он посылает только одно сообщение. Мне его надо вычитать.
Даже если я читаю побайтно то
1) я не знаю последний ли это байт
2) При попытке прочитать следующий байт, если его нет, все замирает

Сообщения не фиксированой длины
 

deek

Новичок
тогда либо неблокирующее чтение, либо таймаут и чтение по 1 байту.
 
Сверху