我希望能够使用 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。
这种情况是否有某种信号或标志,或者我必须在应用层实现我自己的类似心跳的功能?