Не получается отследить потерю связи по сети. Linux, сокеты. |
Здравствуйте, гость ( Вход | Регистрация )
Не получается отследить потерю связи по сети. Linux, сокеты. |
demon051 |
25.7.2018, 16:45
Сообщение
#1
|
Студент Группа: Участник Сообщений: 27 Регистрация: 12.8.2014 Пользователь №: 4209 Спасибо сказали: 4 раз(а) Репутация: 0 |
Всем привет.
Работаю с неблокирующими сокетами под Linux. Не получается отследить ситуацию потери сети. Т.е., например, вынули разъем из сетевой карты. метод select(ss[0]+1, &read_fs, &write_fs, &error_fs, &rwe_timeout); в этом случае сообщает всё время, что для записи готов дескриптор write_fs результат вызова select = 1 в итоге не могу поймать переподключение клиента после восстановления связи по сети, т.к. всё время кручусь в цикле опроса дескрипторов и повода для выхода из него нет... Что делаю не так? |
|
|
Iron Bug |
28.7.2018, 2:07
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
доступность сокета для записи будет постоянной, потому что система буферизует вывод.а таймаут на TCP-сессии очень большой и если даже сеть временно отваливается, это не значит, что сессия сдохла.
по идее, отпадение клиента обычно проверяют отправкой каких-то сообщений, на которые клиент должен отвечать. либо ставить таймауты на ответ клиента: если клиент долгое время не подаёт признаков жизни, то закрывать сессию и пусть переподключается. теоретически, можно заюзать SO_KEEPALIVE, но в стандартных настройках таймаут равен двум часам, так что сессия висит долго и этот метод малоэффективен, если не дёргать системные настройки. |
|
|
Текстовая версия | Сейчас: 28.11.2024, 14:49 |