Как узнать, застрял ли установленный сокет на сервере, который ожидает ввода? - PullRequest
1 голос
/ 05 июня 2010

У меня есть скрипт, который сканирует порты на наличие открытых прокси-серверов. Проблема в том, что если он сталкивается с программой входа в систему (в частности, с telnet), то он там висит навсегда, так как не знает, что делать, и в итоге сервер закрывает соединение.

Простым решением было бы создать кучу дел. Если телнет, сделай это. Если SSH, сделай это. Если что-то еще, бла-бла-бла. Я хотел бы получить зонтичное решение, так как сценарий не является для меня высоким приоритетом.

Сценарий, как и сейчас, доступен по адресу http://parkrrr.net/socks/scan.phps

В небольшом масштабе (на странице может быть в среднем 15 посещений в день) это хорошо, но в большем масштабе я бы беспокоился о большом количестве открытых зомби-сокетов.

Замена! $ Strpos не работает, поскольку серверы могут вернуть больше информации, чем вы запрашивали (заголовки, реклама и т. Д.).

Принятие только фиксированного количества байтов (в отличие от добавления до EOF, которое он делает сейчас) из $ fgets также не работает. Я уверен, что это где он застрял: while (! feof ($ fp)) { $ Данные = fgets ($ ∥f∥p, 512). }

Но что я могу сделать? Любые другие предложения / предупреждения также приветствуются.

Ответы [ 2 ]

1 голос
/ 06 июня 2010

Используйте неблокирующие розетки и stream_select с таймаутом или прямым опросом.

1 голос
/ 05 июня 2010

Используйте stream_set_timeout , чтобы установить тайм-аут чтения / записи на сокете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...