【问题标题】:SO_KEEPALIVE: Set on the server socket or on a per-client basis?SO_KEEPALIVE:在服务器套接字上设置还是在每个客户端上设置?
【发布时间】:2017-09-12 12:09:24
【问题描述】:

我有以下函数用于为套接字配置 TCP Keepalive:

int configure_tcp_keepalive(int fd)
{
    int opt_val = 1;
    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt_val, sizeof(opt_val)) == -1)
        return -1;

    int keepcnt = 9; //default value on Linux
    if (setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt)) == -1) 
        return -1;

    int keepidle = 30;
    if (setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle)) == -1) 
        return -1;

    int keepintvl = 30;
    if (setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl)) == -1) 
        return -1;
}

如果我在服务器 fd 上调用此函数,它会影响每个接受()的客户端(即接受()的客户端是否会继承这些套接字选项并因此配置为 TCP Keepalive)?我宁愿不必为每个客户端调用此函数,以尽量减少开销。谢谢。

【问题讨论】:

    标签: c linux sockets tcp setsockopt


    【解决方案1】:

    看起来这应该可行。 《Unix网络编程》这本书说:

    【讨论】:

    • 谢谢,我想知道这是否也适用于其他 SO_KEEPALIVE 选项。我想我得和 Wireshark 核实一下。
    • 可能。这本书很旧,当时可能不存在这些选项。试试看。
    • 是的。它们也适用。
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2011-08-03
    • 2016-03-18
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多