Всем привет.
Работаю с неблокирующими сокетами под Linux.
Не получается отследить ситуацию потери сети. Т.е., например, вынули разъем из сетевой карты.
метод
select(ss[0]+1, &read_fs, &write_fs, &error_fs, &rwe_timeout);
в этом случае сообщает всё время, что для записи готов дескриптор write_fs
результат вызова select = 1
в итоге не могу поймать переподключение клиента после восстановления связи по сети, т.к. всё время кручусь в цикле опроса дескрипторов и повода для выхода из него нет...
Что делаю не так?
доступность сокета для записи будет постоянной, потому что система буферизует вывод.а таймаут на TCP-сессии очень большой и если даже сеть временно отваливается, это не значит, что сессия сдохла.
по идее, отпадение клиента обычно проверяют отправкой каких-то сообщений, на которые клиент должен отвечать. либо ставить таймауты на ответ клиента: если клиент долгое время не подаёт признаков жизни, то закрывать сессию и пусть переподключается.
теоретически, можно заюзать SO_KEEPALIVE, но в стандартных настройках таймаут равен двум часам, так что сессия висит долго и этот метод малоэффективен, если не дёргать системные настройки.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)