Я хочу быть в состоянии определить, потеряно ли соединение между клиентом и сервером в течение разумного времени в Linux с использованием языка программирования C. Я сделал следующее:
int flags = 1;
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &flags, sizeof(flags));
int idle = 3;
int intvl = 1;
int cnt = 5;
setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &idle, sizeof(idle));
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl));
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt));
Я проверил его в Wireshark, и это успешно включило поддержку активности TCP.
Я прочитал, что эта функция не закрывается автоматически после последнего исследования keepalive, поэтомуЯ предполагаю, что есть какой-то способ проверить это условие, чтобы иметь возможность закрыть сокет вручную.
Я хочу периодически делать что-то подобное для каждого дескриптора файла открытых сокетов:
if (sentProbes >= cnt) {
if(fd >= 0){
close(fd);
}
fd = CLOSED_FD;
}
Я попробовал ответить на этот вопрос от Симона , но он не сработал. getsockopt вернул 0, а ошибка также была равна 0 даже после последней проверки.
Есть ли какой-либо сигнал или флаг для этого условия, или я должен реализовать свою собственную функцию, подобную сердцебиению, на прикладном уровне?