Как вы получаете уведомление о последней проверке TCP Keepalives? - PullRequest
1 голос
/ 17 октября 2019

Я хочу быть в состоянии определить, потеряно ли соединение между клиентом и сервером в течение разумного времени в 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 даже после последней проверки.

Есть ли какой-либо сигнал или флаг для этого условия, или я должен реализовать свою собственную функцию, подобную сердцебиению, на прикладном уровне?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...