TCP_KEEPIDLE
、TCP_KEEPINTVL
和 TCP_KEEPCNT
是 TCP 套接字选项,用于控制 TCP 连接的保活机制。这些选项通常用于在长时间空闲的连接中检测对端是否存活,并在必要时终止连接。
-
TCP_KEEPIDLE
:指定开始发送 TCP KeepAlive 消息之前,连接可以保持空闲的时间(单位为秒)。当连接空闲时间超过该值后,将开始发送 KeepAlive 消息。 -
TCP_KEEPINTVL
:指定两次 KeepAlive 消息之间的时间间隔(单位为秒)。在发送第一次 KeepAlive 消息后,如果没有收到响应,将在指定的时间间隔后再次发送。 -
TCP_KEEPCNT
:指定在没有收到对端响应的情况下,发送 KeepAlive 消息的次数。达到指定次数后仍未收到响应,连接将被认为已断开。
这些选项通常通过 setsockopt
函数来设置,示例代码如下:
int enable = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(int)); // 启用 TCP KeepAlive 机制int keepidle = 60; // 60秒
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(int)); // 设置 TCP_KEEPIDLEint keepintvl = 10; // 10秒
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(int)); // 设置 TCP_KEEPINTVLint keepcnt = 3; // 3次
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(int)); // 设置 TCP_KEEPCNT
通过设置这些选项,可以调整 TCP 连接的保活机制,以确保连接在长时间空闲后能够及时检测到对端的存活状态,从而避免僵死连接。
// 启用 TCP Keep-Aliveint keepalive = 1;setsockopt(socketFd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));// 设置 Keep-Alive 时间和重试次数int keep_idle = 2; // 空闲 2 秒开始发送Keep-Alive探测数据包int keep_interval = 1; // 每 1 秒发送一个探测数据包int keep_count = 2; // 最多发送 2 次探测数据包setsockopt(socketFd, IPPROTO_TCP, TCP_KEEPIDLE, &keep_idle, sizeof(keep_idle));setsockopt(socketFd, IPPROTO_TCP, TCP_KEEPINTVL, &keep_interval, sizeof(keep_interval));setsockopt(socketFd, IPPROTO_TCP, TCP_KEEPCNT, &keep_count, sizeof(keep_count));