c++ - 套接字保活不工作

标签 c++ linux sockets tcp

我有一个客户端 connect() 到服务器,当空闲时,它会在几个小时后超时。 我加了 setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE...) 1 秒 但这并没有什么不同。 关于为什么 keepalive 不起作用的任何线索? 如果我使用 SOL_TCP 而不是 SOL_SOCKET,会有什么不同吗? 这是在 Linux 上。

最佳答案

int val = 1;
setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof val)

只启用keepalive。您将获得 keepalive 探测的默认计时器,您可以使用以下命令查看:

sysctl net.ipv4.tcp_keepalive_time

通常默认为几个小时。

如果你想改变默认定时器,你可以使用这个:

struct KeepConfig cfg = { 60, 5, 5};
set_tcp_keepalive_cfg(fd, &cfg);

在这里使用辅助函数:

struct KeepConfig {
    /** The time (in seconds) the connection needs to remain 
     * idle before TCP starts sending keepalive probes (TCP_KEEPIDLE socket option)
     */
    int keepidle;
    /** The maximum number of keepalive probes TCP should 
     * send before dropping the connection. (TCP_KEEPCNT socket option)
     */
    int keepcnt;

    /** The time (in seconds) between individual keepalive probes.
     *  (TCP_KEEPINTVL socket option)
     */
    int keepintvl;
};

/**
* enable TCP keepalive on the socket
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int set_tcp_keepalive(int sockfd)
{
    int optval = 1;

    return setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
}

/** Set the keepalive options on the socket
* This also enables TCP keepalive on the socket
*
* @param fd file descriptor
* @param fd file descriptor
* @return 0 on success -1 on failure
*/
int set_tcp_keepalive_cfg(int sockfd, const struct KeepConfig *cfg)
{
    int rc;

    //first turn on keepalive
    rc = set_tcp_keepalive(sockfd);
    if (rc != 0) {
        return rc;
    }

    //set the keepalive options
    rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &cfg->keepcnt, sizeof cfg->keepcnt);
    if (rc != 0) {
        return rc;
    }

    rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &cfg->keepidle, sizeof cfg->keepidle);
    if (rc != 0) {
        return rc;
    }

    rc = setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &cfg->keepintvl, sizeof cfg->keepintvl);
    if (rc != 0) {
        return rc;
    }

    return 0;
}

关于c++ - 套接字保活不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21867723/

相关文章:

C 程序之间通过自组织网络进行通信

c++ - 将 64 位整数中的每隔一位与 32 位整数进行比较

c++ - QML OpenGL 插件不以 60Hz 刷新

python - 如何更改 Bash 在 Linux 中查找 Python 的位置?

linux - Linux 中是否有一个程序可以执行命令并在失败时发送电子邮件?

c++ - Accept() 在重复连接尝试时无限期地阻塞

python - ZMQ : No subscription message on XPUB socket for multiple subscribers (Last Value Caching pattern)

c++ - 如果模板参数复杂,则在模板函数中应用std::conj

c++ - minGW CPP G++ 正确的编译命令

AJAX 棋盘游戏在 Windows 中运行良好,但在 Linux 中运行不佳