читать все данные, полученные из сокета в PHP - PullRequest
0 голосов
/ 01 июня 2009

Я пишу простую клиентскую библиотеку telnet. Я открываю сокеты с помощью fsockopen () и читаю и пишу в сокет с помощью fgetc () и fwrite (). Я использую fgetc () вместо fread () для обработки специальных команд и опций Telnet, таких как (IAC, ...).

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

вот мой метод чтения:

protected function getChar()
{
    $char = fgetc( $this->_socket );
    return $char;
} // public function getChar()

В настоящее время я использую это условие, чтобы убедиться, что поток завершен:

$char = $this->getChar();
if ( $char === false ) {
    // end of the stream.
}

Есть ли другой способ узнать, что поток завершен и все данные прочитаны?

Udate: Я думаю, что символ EOF в протоколе Telnet - это не то, что PHP ожидает как EOF, и поэтому сценарий не может найти конец потока. Кто-нибудь знает, что такое символ EOF (конец файла) в протоколе Telnet?

Ответы [ 4 ]

1 голос
/ 03 июня 2009

Попробуйте повторить шестнадцатеричные значения каждого символа, который вы получаете. Вы должны видеть, что вы получаете как EOF, даже если PHP не распознает это как таковое. Посмотрите на ord () и bin2hex ()

1 голос
/ 01 июня 2009

Есть <a href="http://php.net/manual/en/function.feof.php" rel="nofollow noreferrer">feof</a>(), который может быть полезен.

0 голосов
/ 05 октября 2012

Telnet не имеет токена окончания потока (char). Он просто отправляет приглашение и прекращает отправку. Поэтому лучший способ - перехватить поток вывода на тексте приглашения.

0 голосов
/ 10 июня 2009

Я искал и не нашел ничего полезного. Затем я попытался выяснить, что делает telnetlib в python для этой проблемы (я только изучаю python), и обнаружил, что даже библиотека python не ищет EOF. он просто продолжает читать поток, пока не истечет время ожидания, или пока не пройдет определенное количество времени, или поиск специальной строки не вернет результат. поэтому я использовал тот же метод для чтения и решил свою проблему. спасибо за все ответы и комментарии. Я постараюсь убедить мою компанию распространять эту библиотеку telnet с лицензией, совместимой с открытым исходным кодом. если это произойдет, я обновлю здесь.

...