套接字保持活动不工作

2023-11-21

我有一个客户端 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)

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

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

套接字保持活动不工作 的相关文章

随机推荐

  • 无限循环heisenbug:如果我添加打印输出,它就会退出

    这是我的源代码 include
  • 如何在Excel的vba中初始化多维数组变量

    The 微软网站建议以下代码应该有效 Dim numbers 1 2 3 4 5 6 但是 当我尝试在 Excel VBA 模块中使用它时 出现编译错误 以下内容适用于一维数组 A Array 1 2 3 4 5 但是我还没有找到一种方法对
  • 在 Service Fabric 集群中存储大量状态

    我有一个场景 我们需要存储 x 100 GB 的数据 一般来说 数据是服务结构集群本身中参与者 良好分区 仅由特定参与者使用 持久状态的良好候选者 对于这种规模的数据 是否建议使用服务结构持久状态存储 我们的计算负载将相当低 因此仅仅为了存
  • 如何在 Angular2 中处理多个 queryParams

    我正在尝试在新的 Angular2 应用程序中实现过滤机制 这将允许我过滤数组中的条目列表 这些条目可能有大约 20 个可以过滤的属性 到目前为止 我已经在一个组件中创建了一个过滤器列表 然后创建了一个作为子组件路由到的列表组件 然后我计划
  • 接受用户输入在 Django 中创建用户

    我想使用用户输入在 Django 中创建 添加新用户到我的应用程序 我使用 django 提供的默认登录 我正在尝试将用户添加到默认登录 中的例子https docs djangoproject com en dev topics auth
  • Java 包自省 [重复]

    这个问题在这里已经有答案了 如何获取包中的所有类 你不能 类可以通过许多不同的类加载器进入 包括远程类加载器
  • Chrome 在设置 a:visited css 属性时是否有问题?

    我无法设置背景颜色 visited超链接到不同的背景颜色 这是 Google Chrome 的已知问题吗 我见过有人对背景图像提出类似的问题 设置颜色属性似乎工作正常 这是我使用的代码 a visited background color
  • 类继承不明确

    include
  • C# - 泛型方法与非泛型方法

    我对为什么 何时想要使用泛型方法感到有点困惑 因为非泛型方法可以访问其包含类的泛型成员并无论如何都可以传递泛型参数 因此 使用一个可能没有抓住重点的固定示例 但强调了我问这个问题的原因 我为什么要这样做 public class SomeG
  • 应用程序关闭/终止时 Android 中的 Firebase 推送通知问题

    当应用程序仅包含数据负载关闭时 Firebase 推送在某些设备上不起作用 请参阅此线程 https github com firebase quickstart android issues 41 我知道当应用程序被滑动杀死时 一些 OE
  • Mac OS X:在应用程序商店中启动时启动?

    我需要在系统启动时启动我的应用程序 但问题是 它已经在 App Store 中 所以我必须遵循一些规则 例如使用沙箱 这会导致所需功能的失败 例如LSSharedFileListInsertItemURL and SMLoginItemSe
  • 如何在滚动上反应 konva 缩放

    你好 我试图在我的反应项目中的矩形上实现缩放功能 但找不到一种方法来以反应方式做到这一点 有什么帮助吗 这是我找到的 html konva 示例 https konvajs github io docs sandbox Zooming Re
  • 45000 毫秒后无法通过端口 7055 连接到主机 127.0.0.1。带有 FF 版本 26.0 和 selenium 独立 jar 2.39

    我正在尝试连接到我的 AWS unix 计算机上安装的 FF 版本 26 0 的 selenium 2 30 但是当我启动访问 selenium 的客户端时 出现以下错误 另外 当我尝试使用 selenium 独立 jar 2 38 0 进
  • 访问跟踪进程的内存空间的低开销方法?

    我正在寻找一种有效的方法来访问 对于读取和写入操作 我的 ptraced 子进程的内存空间 正在访问的块的大小可能从几个字节到几兆字节不等 因此使用 ptrace 调用PTRACE PEEKDATA and PTRACE POKEDATA一
  • C++字符串内存管理

    上周 我用 C 编写了几行代码 将一个大型文本文件 300 000 行 启动到字典中 写了十分钟 不到一秒就执行了 现在我正在将这段代码转换为 C 因为我需要在旧的 C COM 对象中使用它 到目前为止我已经花了两天时间了 虽然生产力差异本
  • Rails 3 检测来自移动客户端的请求

    我的设置 Rails 3 0 9 Ruby 1 9 2 我的应用程序需要根据请求的来源提供移动与网页布局 我需要支持所有主要的移动客户端前端 如 iPhone Android 黑莓等 在我的代码中检测此问题的最简单方法是什么 最简单的方法是
  • 我可以修补 Python 的断言以获得 py.test 提供的输出吗?

    Pytest 失败断言的输出比 Python 中的默认输出更丰富 更有用 我想在正常运行 Python 程序时利用这一点 而不仅仅是在执行测试时 有没有办法从我的脚本中覆盖Python的assert使用 pytest 打印堆栈跟踪的行为 同
  • jetty-env.xml 与 DataSource 导致 mvn jetty:run 上的 WebAppContext 失败

    我有一个非常简单的 webapp 项目 使用 Maven 和 jetty 到目前为止一直运行良好 但现在我需要使用 JNDI 设置 MySQL 连接池 因为数据库连接总是超时 首先这里是我的pom xml的相关内容
  • 在Python中查找原始异常的模块名称

    Example gt gt gt try myapp foo doSomething except Exception e print Thrown from modname e Thrown from myapp util url 在上面
  • 套接字保持活动不工作

    我有一个客户端 connect 到服务器 当空闲时 它会在几个小时后超时 我添加了 setsockopt socket SOL SOCKET SO KEEPALIVE 1 秒 但这没有什么区别 关于为什么 keepalive 不起作用的任何