TCP保活机制原理
TCP保活机制是一种检测TCP连接对端是否仍然可达的机制。当一方(通常是客户端)怀疑对端(服务端)可能已经奔溃或变得不可达时,它可以发送保活探测包(通常是一个空的TCP段,仅包含TCP头)来检查对端是否仍然响应。
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
std::cerr << "Socket creation failed" << std::endl;
return -1;
}
// 开启TCP保活机制
int keepAlive = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive)) < 0) {
perror("setsockopt SO_KEEPALIVE failure");
close(sockfd);
return -1;
}
// 设置TCP保活探测参数(这些选项在Linux上是可用的,但在其他系统上可能不可用)
int keepalive_time = 60; // 空闲多久后开始发送保活探测包
int keepalive_intvl = 1; // 探测包发送间隔
int keepalive_probes = 3; // 发送多少个探测包无响应则断开连接
// 注意:optlen需要设置为optval的大小
socklen_t optlen = sizeof(int);
// 设置TCP_KEEPIDLE(空闲多久后开始发送保活探测包)
if (setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepalive_time, optlen) < 0) {
perror("setsockopt TCP_KEEPIDLE failure");
close(sockfd);
return -1;
}
// 设置TCP_KEEPINTVL(探测包发送间隔)
if (setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepalive_intvl, optlen) < 0) {
perror("setsockopt TCP_KEEPINTVL failure");
close(sockfd);
return -1;
}
// 设置TCP_KEEPCNT(发送多少个探测包无响应则断开连接)
if (setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepalive_probes, optlen) < 0) {
perror("setsockopt TCP_KEEPCNT failure");
close(sockfd);
return -1;
}
// 假设后续进行connect等操作...
// 关闭套接字等操作...
close(sockfd);
return 0;
}
注意事项:
-
TCP_KEEPCNT
在某些系统上可能不可用或名称不同。例如,在较旧的 Linux 版本中,这个选项可能不存在,或者需要使用不同的方法来配置探测次数。 -
如果您的系统不支持这些选项,代码将编译通过但运行时
setsockopt
会失败。 -
在使用这些选项之前,请检查您的系统文档和内核版本,以确保它们可用。
-
这些设置将影响通过该套接字建立的 TCP 连接的保活行为。如果它们对您的应用程序不是必需的,或者您不确定如何配置它们,请小心使用。
-
建议可以在应用层设置心跳机制。