как отловить действительно закрывшийся сокет

hvosting

Новичок
как отловить действительно закрывшийся сокет

вопрос наверное простой, но, кажется, дока не вполне соответствует действительности...
даже после закрытия сокета, socket_select оставляет его в массиве write....



дано
сокет создался, законнектился по TCP на внешнюю IP, через него "вдули" запрос.
отвечающий сервер выдал заголовок-приветствие, и (в связи с высокой загрузкой)
крепко задумался.

Вопрос - как можно проверить факт того что сервер, с которым происходило соединение
передачу уже закончил и сокет со своей стороны закрыл?

вариант - "если в течение 1-2-3 секунд от него не поступало новых данных" не катет,
ответ иногда приходит моментально, иногда задержки 5-10 сек и выше.
 

dimagolov

Новичок
закрытие сокета другим участником приводит к отправке пакета с соответствующим флагом, на который recieve возвращает ошибку вместо приема данных в буфер.
 

hvosting

Новичок
ребята, что никто сокетами не пользовался?

пока обнаружил какую то не вполне логичную разницу в
выводе
socket_get_option($socket, getprotobyname('tcp') , SO_BROADCAST) ,

но т.к. логика не ясна, применить для определения живости сокета не получается.
 

ys

отодвинутый новичок
hvosting

Попробуйте использовать массив except.
Посмотрите в сторону SO_KEEPALIVE.


> socket_get_option($socket, getprotobyname('tcp') , SO_BROADCAST)

В чем божественный смысл этой конструкции?
 

cDLEON

Онанист РНРСlub
ys
Самого немного интересует этот вопрос...
Есть скрипт-демон. Работает сразу с кучей клиентов.
Где то через 3-ри часа отличной работы (клиенты и подключаются и отключаются) в пулле сокетов остаются умершие сокеты, и socket_select начинает матюкаться что тип у него на входе присутствует невалидный сокет. А как его из этого массива убрать я нинаю =(
Да и в инете ни чего не нарыл по этому поводу...
 

hvosting

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

SO_KEEPALIVE и массив except кажется проверял на четверке.
Попробую на пятерке еще раз.
 

ys

отодвинутый новичок
cDLEON
>Самого немного интересует этот вопрос...
Какой вопрос? Тут мы обсуждаем немного другой вопрос. Создайте другую тему, если есть какие-то вопросы непосильные поиску :).

hvosting
Я немного не понял про четверки и пятерки, видимо не силен в телепатии.
Вообще, как я понял из исходников, php предоставляет для работы с сокетами некий front-end. А все остальное, что влияет на поведение данных операций, зависит от настроек вашей конкретной машины и реализации стека IP.

Завершение сеанса с удаленной стороны определяется (для протокола TCP) или отправкой пакета с флагом FIN, либо, если наша машинка как-то пропустила этот момент или удаленная система, например, перезагрузилась, получением ICMP пакета "port unreachable". В обоих случаях должен дергаться массив exept(ion), для сигнализации в изменении в состоянии соединения.

P.s: заполнять данные массивы для селекта надо каждый раз по новой, чтоб туда не попадали "дохлые" сокеты...
 
Сверху