尽管 KEEPALIVE,TCP、recv 函数仍挂起

2023-12-11

在服务器挂掉后,TCP keepalive(具有较小的超时)是否会阻止客户端挂在接收上?

场景:

服务器和客户端运行在不同的机器上:

  1. 客户端通过带有 KEEPALIVE 选项的 TCP 连接到服务器
  2. 客户端发送“Hello server”并等待响应
  3. 服务器收到“Hello server”并响应“Hello client”
  4. 客户端收到响应,休眠 10 秒并重复步骤 2-4(现在跳过步骤 1 - 保留连接)

在客户端睡眠期间,服务器已关闭,现在:

  1. 客户醒来
  2. 发送“Hello server”并等待响应
  3. 20 分钟后,recv 放弃 - 我期望 KEEPALIVE 会在45秒:

设置 KEEPALIVE 选项:

void TCPclient::setkeepalive()
{
   int optval;
   socklen_t optlen = sizeof(optval);

   /* Check the status for the keepalive option */
   if(getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) {
        throw std::string("getsockopt");
   }

   optval = 1;
   optlen = sizeof(optval);
   if(setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
      close(s);
      exit(EXIT_FAILURE);
   }

    optval = 2;
    if (setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &optval, optlen) < 0) {
        throw std::string("setsockopt");
    }

    optval = 15;
    if (setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &optval, optlen) < 0) {
        throw std::string("setsockopt");
    }

    optval = 15;
    if (setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &optval, optlen) < 0) {
        throw std::string("setsockopt");
    }   
}

Linux 3.2.0-84-通用


当线路空闲 15 秒后,Keepalive 将变为活动状态。在您的情况下,Keepalive 启动超时为 15 秒,睡眠为 10 秒,这意味着“Hello server”将是服务器被杀死后发送的下一个命令。

您的 Linux 将尝试多次重新传输该消息。 Keepalive 仍然不会被触发。达到重试限制后,连接将中断 - 这将需要 10-30 分钟。

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

尽管 KEEPALIVE,TCP、recv 函数仍挂起 的相关文章

  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • VSCODE 在 Linux 上不适用于我

    刚刚了解 VSCODE 很高兴尝试一下 我下载 解压并运行可执行文件 我得到 Code 2183 0429 201254 ERROR browser main loop cc 170 Running without the SUID san
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 如何对 Flask 端点进行 pytest

    我开始使用 Flask 和 Pytest 来通过单元测试实现休息服务 但我遇到了一些麻烦 我想为我的简单端点做一个简单的测试 但我不断得到一个Working outside of application context 运行测试时出错 这是
  • 程序化 Dojox 上传器 - ajax 上传不起作用

    我找不到任何有关以编程方式创建 dojox form Uploader 的文档 我自己尝试过 但看起来插件注册机制不知何故被破坏了 require dojo dom construct dijit form Button dojox for
  • 无法在 M1 Mac 上导入 Pygame.mixer

    运行代码时import pygame mixer 或任何其他引用 pygame mixer 的内容 在 2021 M1 MacBook Air 上运行命令后python3 我收到错误ModuleNotFoundError No module
  • 时间:2019-03-17 标签:c#controlnames

    有没有办法控制 Net 如何设置Name and ID我的控件的属性 我有一些单选按钮 我需要其名称相同 但是如果我设置ID单选按钮控件的属性 它设置Name和ID 我看不出有什么办法可以治疗ID and Name分别地 所以现在所有按钮的
  • 使用Reflection解析函数/方法内容

    我的单元测试框架由 TestFixtures TestMethods 和 Actions 组成 Action是TestMethod内部额外的一个较小的容器 Actions来自我们公司内部编写的Dll 操作在方法内部使用 如下所示 Test
  • 让两个对象在 SwingBot 中移动

    我试图做到这一点 以便在按下命令时两个形状都会移动 我的问题是 如何让蓝色多边形与黄色矩形一起移动 无论我做什么 我似乎都无法弄清楚 任何帮助表示赞赏 谢谢 EDIT 删除了计时器代码 它是为了不同的东西 import javax swin
  • 用 Python 编写单元测试:如何开始? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我用 Python 完成了第一个正式项目 现在我的任务是为其编写测试 由于这是我第一次做一个项目 这也是我第一次为其编写测试 问题是 how我开始吗 我完全不知道 任何人都可以向
  • 有没有办法只显示基于数组的 json 对象中选定的属性

    我有以下对象 calendarLists Title titel1 Color blue number 1 Title titel2 Color green number 2 Title titel3 Color red number 3
  • SpringBoot:GenericJDBCException: 无法获取 JDBC 连接

    我通过使用以下属性动态创建 DataSource 来连接到 mysql 数据库 它工作正常 但一段时间后它不断给我错误 无法获取 JDBC 连接 package com test db import org springframework
  • 使用堆快照分析显示内存地址,但不显示代码行。如何确定导致堆增长的原因?

    我的应用程序即将完成 在提交到应用程序商店之前 我正在使用 Instruments 来优化性能 我注意到 每当我执行特定操作 从外部服务器更新应用程序中的信息 时 我的堆就会增长约 350 KB 我在 stackoverflow 和 App
  • Linq 帮助 - Sql 跟踪返回结果,但数据上下文返回 null

    var adminCov db SearchAgg AdminCovs SingleOrDefault l gt l AdminCovGuid covSourceGuid adminCov 不断返回 null 当我运行 SQL Profil
  • 如何在犰狳中序列化稀疏矩阵并与boost的mpi实现一起使用?

    我一直在尝试序列化稀疏矩阵犰狳 cpp 库 我正在做一些大规模的数值计算 其中数据存储在稀疏矩阵中 我想使用 mpi Boost 实现 收集这些矩阵并对来自不同节点的矩阵求和 我现在陷入困境的是如何将稀疏矩阵从一个节点发送到其他节点 Boo
  • 由于 windows 中的 openssl/ETimedout,gem install Rails 无法工作

    最初 我有ruby 1 9 3我的 Windows 7 中安装的版本 我已经安装了ruby 2 0 0p195最近并从命令提示符进行了测试 ruby v ruby e puts 100 irb 效果很好 ruby v gives ruby
  • 如何从 Spring Boot Endpoint Service 返回自定义 SOAP 错误?

    我已经设置了一个 Web 服务应用程序 它接收并仅记录来自第三方的 SOAP 请求 记录后必须返回定义的响应 如果没有错误并且接收到的 SOAP 请求与 WSDL 匹配 则此操作不会出现任何问题 不幸的是 第三方在发送无效内容甚至随机数据时
  • 向 CMake 添加命令行选项

    我正在使用 CMake 构建一个大型库 我希望用户能够有选择地启用 禁用构建过程的某些部分 如何将命令行选项添加到我的 CMake 构建中 例如这样用户就可以输入类似的内容cmake build partone nobuild parttw
  • Java 可视化 - 如何在 java 中转置 JTable?

    我正在寻找允许在 UI 上调换 jTable 的方法 可以通过单击按钮或其他操作来实现 我的主要问题是我应该如何为此目的构建数据模型 abstractTableModel Java中有没有现成的方法支持这种转置 如果您谈论的是行 列反转 那
  • 从 getline() 读取逗号分隔的整数

    如何从下面的代码中读取单独的整数 while getline cin line for each integer in line do something myVector push back each integer 输入是这样的 1 2
  • 如何捕获 Laravel 5 中的异常/缺失页面?

    在 Laravel 5 中 App missing and App error不可用 那么你现在如何捕获异常和丢失页面呢 我在文档中找不到与此相关的任何信息 在 Laravel 5 中 您可以通过编辑以下内容来捕获异常render中的方法a
  • 检查输入是否是有效的罗马数字

    我有一个程序可以将罗马数字转换为整数 反之亦然 我的问题是我真的不知道如何创建一个函数来检查用户输入是否是有效的罗马数字 我现在的代码 def checkIfRomanNumeral numeral Controls that the us
  • 尽管 KEEPALIVE,TCP、recv 函数仍挂起

    在服务器挂掉后 TCP keepalive 具有较小的超时 是否会阻止客户端挂在接收上 场景 服务器和客户端运行在不同的机器上 客户端通过带有 KEEPALIVE 选项的 TCP 连接到服务器 客户端发送 Hello server 并等待响