1

我希望能够使用 C 编程语言在 Linux 上检测客户端和服务器之间的连接是否在合理时间内丢失。我做了以下事情:

  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。

我读到这个功能在最后一次 keepalive 探测后不会自动关闭,所以我假设有一些方法可以检查这个条件以便能够手动关闭套接字。

我想定期为每个打开的套接字文件描述符做这样的事情:

if (sentProbes >= cnt) {
  if(fd >= 0){
    close(fd);
  }
  fd = CLOSED_FD;
}

我已经尝试过Simone对这个问题的回答,但没有奏效。getsockopt 返回 0,即使在最后一次探测之后,error 也是 0。

这种情况是否有某种信号或标志,或者我必须在应用层实现我自己的类似心跳的功能?

4

0 回答 0