Всем привет.
Есть клиентский сокет, в который можно писать запросы и одновременно читать ответы от сервера.
Пытаюсь сделать минимальное время реакции на обрыв соединения.
Устанавливаю опции сокета след. образом:
int val = 1;
int keepidle = 2;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,(void*)&val,sizeof(val));
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, (void *) &keepidle, sizeof(keepidle));
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, (void*) &keepidle, sizeof (keepidle));
setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void*) &keepidle, sizeof (keepidle));
Далее происходит блокирующий select() на этом сокете на предмет чтения.
В этот момент выдергиваем Ethernet коннектор из PC, ждем несколько секунд - select выходит с ошибкой timeout
Все как бы хорошо, но если в этот момент ( во время select() ) другой поток отсылает сообщение в сокет серверу,
то timeout не срабатывает вообще. Было так же замечено, что соединение все таки закрывается после ~20мин. ожидания.
Проверялась так же возможность перерывания select на отсылку сообщения и далле переход обратно в select() ( тоесть в одном потоке ) -
поведение аналогичное.
Вопрос: почему такое происходит, как с этим бороться ?
Спасибо.