LINUX.ORG.RU

Почему клиент не отлавливает рахрыва соединения с сервером?


0

0

Есть клиент и и сервер соединенные по TCP/IP.
Сокеты настроены с параметрами : O_NONBLOCK, REUSEADDR, KEEPALIVE, TCP_NODELAY.
Сервер разрывает соединение с клиентом, если в течении некоторого времени нет обмена данными.
Разрыв пытаюсь ловить функцией poll.
При таком разрыве (когда нет обмена данными) клиент не отлавливает отвала сервера, но если при этом физически оторвать кабель от сервера, то разрыв соединения вылавливается ...

НИЧЕГО НЕ ПОНИМАЮ! HELP!!!

anonymous

> Сервер разрывает соединение с клиентом, если

каким образом разрывыает ?

> если при этом физически оторвать кабель от
> сервера, то разрыв соединения вылавливается

то есть, клиент тоже KEEPALIVE ставит ?

возможно, fd leak. если сервер разрывает делая
close() (или exit(), если multiprocess), заменить
на shutdown(). если поможет - искать, где теряется
дескриптор. например не сделан close(new_sk) после
accept() + fork().

idle ★★★★★
()
Ответ на: комментарий от idle

Проверка разрыва производится путем проверки значений POLLHUP например, если проще то если значение revents > 7, то соединение скривело ...
Это все хорошо ... но когда пытаюсь что то писать в сокет, то тут однозначно выявляется разрыв соединения ...
Проблема не решена ...

anonymous
()
Ответ на: комментарий от idle

Ну и добавлю что netstat при этом (когда клиент не ловит разрыв) сединения находятся в состоянии CLOSE_WAIT ... Где бы про это прочитать ?

anonymous
()
Ответ на: комментарий от idle

Есть !
poll() вылетает и говорит, что из этого сокета можно читать,
а read() говорит 0 - признак EOF ...
Вот ведь гемор !

anonymous
()
Ответ на: комментарий от anonymous

При разрыве соединения с другого конца poll() выставляет POLLIN, а read() возвращает 0 - так и должно быть. Вот и используй этот прием.

anonymous
()
Ответ на: комментарий от anonymous

> poll() вылетает и говорит, что из этого сокета можно читать, > а read() говорит 0 - признак EOF ...

это и означает, что соединение закрыто. я же писал про проверку POLLIN!

idle ★★★★★
()
Ответ на: комментарий от idle

Стандартная фишка. Получаеш pollin, и затем read возвращает 0. Самое смешное, что в man-ах про это ни слова, а зато есть MSDN по Winsock ;) Это описанно как "gracefully closed", то есть когда сокет на той стороне закрыт функцией close. А pollhup получаешь именно при нештатных закрытиях соединения. И от M$ какаято польза есть :=) Олег

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.