В вашем цикле вам нужно проверить возвращаемое значение socket_read()
. Если он возвращает FALSE, то произошла ошибка чтения (которая может быть вызвана удаленным хостом, закрывающим соединение). Пример кода в предоставленной вами ссылке охватывает этот случай.
Если вам необходимо корректно обработать определенные состояния ошибок, вы всегда можете проверить код ошибки сокета, используя socket_last_error()
- в этой заметке описаны возможные коды.
Изменить:
При использовании замазки для telnet, если я закрываюсь с помощью кнопки X, соединение в PHP корректно закрывается, но если я отсоединяю провод Ethernet от машины замазки, PHP-сервер просто зависает.
Причина, по которой соединение закрывается при уничтожении PuTTY, заключается в том, что PuTTY закрывает свои открытые соединения при выходе. Это приводит к тому, что socket_read()
возвращается с кодом ошибки (я считаю ECONNRESET
). Если вы потянете сетевой кабель, у него не будет возможности сделать это.
В зависимости от того, как настроена ваша сеть, TCP-соединение должно со временем прерваться. Вы можете попытаться контролировать время ожидания, установив SO_RCVTIMEO
с помощью socket_set_option()
, но это не всегда работает на всех платформах (я смотрю на вас, WinSock) .
В качестве альтернативы, вы можете свернуть свой собственный цикл опроса, используя socket_select()
с разумным временем ожидания. Если ни один из подключенных сокетов не имеет данных для отправки после истечения времени ожидания, уничтожьте сервер.