2009-06-01 3 views
0

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

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

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

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?

+1

Является ли сеансом telnet полным или полудуплексом? –

+0

Я не уверен. как я могу узнать? – farzad

ответ

1

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

+0

хорошая идея. Я попробовал это и обнаружил, что особого характера нет. : D – farzad

1

Возможно feof().

+0

Я тоже пробовал, не помог. в соответствии с PHP documentaion feof() возвращает true, если указателем на файл является EOF, а fgetc() возвращает false, когда указатель файла - EOF. поэтому я не уверен, что есть какая-то разница между $ char === false и feof(). здесь? – farzad

+1

Наверное, нет. Если соединение было закрыто чисто, то EOF будет немедленно возвращен. Если будет время, вы не узнаете. – grawity

0

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

+0

Библиотека telnet завершена и работает уже давно. Мой менеджер согласился выпустить исходный код под лицензией Apache версии 2.0. Я скоро отправлю URL-адрес загрузки. – farzad

0

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

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