Всем привет.
Есть клиентский сокет, в который можно писать запросы и одновременно читать ответы от сервера.
Пытаюсь сделать минимальное время реакции на обрыв соединения.
Устанавливаю опции сокета след. образом:
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() ( тоесть в одном потоке ) -
поведение аналогичное.
Вопрос: почему такое происходит, как с этим бороться ?
Спасибо.
Похожие темы
- Форум быстрый detect закрытия соединения (2018)
- Форум Асинхронный ввод/вывод и pthreads. (2003)
- Форум Совместное использование одного UDP порта двумя сокетами (2023)
- Форум Непонятки с сокетами (2006)
- Форум Закрыть сокет после fork()'a (2005)
- Форум Проблема с сокетами (2011)
- Форум Консольный обмен сообщениями (2017)
- Форум GLib проблема с потоками GMainLoop (2014)
- Форум Постоянные соединения в HTTP для чайника (server-side) (2015)
- Форум Сервер на СИ (2015)