服务端配置TCP探活,超出探活时间后的行为?

server端启动

(完整源码在最后)

配置探活

	setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &(int){5}, sizeof(int));   // 空闲60秒后探测setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPINTVL, &(int){10}, sizeof(int));	 // 探测间隔10秒setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPCNT, &(int){5}, sizeof(int));	 // 最多探测5次

启动服务端

$ ./net 
Waiting for client connection...

client端telnet建连

telnet 9.134.128.138 8484

连接建立,server开始发送探活包

按配置,TCP_KEEPINTVL=10秒发送一次ack,server主动发起,client收到后回复ack。


15:45:03.184535 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:45:03.184799 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 015:45:13.424537 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:45:13.424808 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 015:45:23.664530 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:45:23.664769 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 015:45:33.904536 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:45:33.904779 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 015:45:44.144532 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:45:44.144774 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 015:45:54.384517 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:45:54.384755 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 015:46:04.624540 IP host-server.8484 > client-server.51878: Flags [.], ack 5, win 510, length 0
15:46:04.624798 IP client-server.51878 > host-server.8484: Flags [.], ack 1, win 502, length 0

客户端配置主动丢掉来自server的包

service iptables start
service iptables statusiptables -L -n --line-numbersudo iptables -A OUTPUT -p tcp --sport 8484 -j DROP

五次失败的探活后,server端报错

server端本来在read上等数据,探活又内核完成,探活失败后,read返回负数错误码。

perror(“read error”);打印结果:read error: Connection timed out

		ssize_t bytes_read = read(client_fd, buffer, BUFFER_SIZE - 1);if (bytes_read > 0){buffer[bytes_read] = '\0';printf("Received: %s\n", buffer);}else if (bytes_read == 0){printf("Connection closed by client[5](@ref)\n");break;}else{perror("read error");   // <<<<< 走这里break;}

server端完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/tcp.h>#define BUFFER_SIZE 256int main()
{int server_fd, client_fd;struct sockaddr_in server_addr, client_addr;socklen_t client_len = sizeof(client_addr);char buffer[BUFFER_SIZE];if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket creation failed");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8484);if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("bind failed");close(server_fd);exit(EXIT_FAILURE);}if (listen(server_fd, 5) < 0){perror("listen failed");close(server_fd);exit(EXIT_FAILURE);}printf("Waiting for client connection...\n");if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len)) < 0){perror("accept failed");close(server_fd);exit(EXIT_FAILURE);}int keepalive = 1;if (setsockopt(client_fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive)) < 0){perror("setsockopt(SO_KEEPALIVE) failed");close(client_fd);close(server_fd);exit(EXIT_FAILURE);}setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &(int){5}, sizeof(int));   // 空闲60秒后探测setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPINTVL, &(int){10}, sizeof(int));	 // 探测间隔10秒setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPCNT, &(int){5}, sizeof(int));	 // 最多探测5次printf("Client connected from %s:%d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));while (1){ssize_t bytes_read = read(client_fd, buffer, BUFFER_SIZE - 1);if (bytes_read > 0){buffer[bytes_read] = '\0';printf("Received: %s\n", buffer);}else if (bytes_read == 0){printf("Connection closed by client[5](@ref)\n");break;}else{perror("read error");break;}}close(client_fd);close(server_fd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…

MySQL 中如何查看 SQL 的执行计划?

SQL 语句前面使用 EXPLAIN 关键字&#xff1a; EXPLAIN SELECT * FROM users WHERE id 1; 字段 含义 id 查询的序号&#xff08;如果是子查询或联合查询&#xff0c;会有多个 id&#xff09;。 select_type 查询的类型&#xff08;简单查询、子查询、联合查询等&#xff…

Discourse 中集成 Claude 3.7 Sonnet 模型

如果 Discourse 实例已经接入了 Anthropic。 那么只需要在后台挑一个不希望继续使用的模型改下就好。 否则需要重新在 Discourse 实例中配置 AI&#xff0c;然后获得 Anthropic 的 key。 进入后台的 AI 然后选择 LLMs 虽然我们这里已经显示成 3.7 了&#xff0c;但实际上所有…

Oracle 12c Docker安装问题排查 sga_target 1536M is too small

一、问题描述 在虚拟机环境&#xff08;4核16GB内存&#xff09;上部署 truevoly/oracle-12c 容器镜像时&#xff0c;一切运行正常。然而&#xff0c;当在一台 128 核 CPU 和 512GB 内存的物理服务器上运行时&#xff0c;容器启动时出现了 ORA-00821 等错误&#xff0c;提示 S…

DeepSeek 提示词:高效的提示词设计

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

KIMI K1.5:大规模强化学习在大语言模型中的应用与工程实践

目录 1、核心技术创新:长上下文强化学习 2、策略优化的技术细节 2.1、在线镜像下降变体 2.2、长度惩罚机制 2.3、智能采样策略 3、工程架构创新 3.1、混合部署框架 3.2、代码沙箱与奖励模型 3.3、分布式系统架构 4、实验成果与性能提升 5、结论与未来展望 大语言模…

从 0 到 1:使用 Docker 部署个人博客系统

引言 在当今数字化时代&#xff0c;拥有一个个人博客来记录自己的学习、生活和见解是一件非常有意义的事情。然而&#xff0c;传统的博客部署方式往往涉及复杂的环境配置和依赖管理&#xff0c;容易让人望而却步。而 Docker 的出现&#xff0c;为我们提供了一种简单、高效的解…

多进程网络服务端详细说明文档

多进程网络服务端详细说明文档 一、概述 本项目实现了一个基于多进程的 TCP 网络服务端&#xff0c;主要用于处理多个客户端的连接请求。为了提高代码的可维护性和可复用性&#xff0c;分成了头文件&#xff08;.h&#xff09;和多个源文件&#xff08;.cpp&#xff09;。具体…

HDFS数据多目录、异构存储、回收站

1.NameNode元数据多目录 HDFS集群中可以在hdfs-site.xml中配置“dfs.namenode.name.dir”属性来指定NameNode存储数据的目录&#xff0c;默认NameNode数据存储在${hadoop.tmp.dir}/dfs/name目录&#xff0c;“hadoop.tmp.dir”配置项在core-site.xml中。 我们也可以将NameNod…

TFChat:腾讯大模型知识引擎(DeepSeek R1)+飞书机器人实现AI智能助手

效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1&#xff0c;项目为sanic和redis实现&#xff0c;利用httpx异步处理流式响应&#xff0c;同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…

HTML5 面试题

1. HTML5 新增了哪些重要特性&#xff1f; 语义化标签&#xff1a;这些标签有助于提高页面的可读性和可维护性。多媒体支持&#xff1a;HTML5 引入了 和 标签&#xff0c;可以直接嵌入音频和视频文件&#xff0c;无需依赖插件。本地存储&#xff1a;引入了 localStorage 和 se…

【Linux】Linux常用命令

目录 文件和目录相关命令查看和管理进程磁盘和文件系统管理用户和权限管理网络相关命令文本处理命令系统状态查看命令软件包管理命令计划任务和后台作业其他常用命令 1. 文件和目录相关命令 命令作用示例pwd显示当前工作目录pwdls列出目录内容ls -l 查看详细信息cd切换目录cd…

布署elfk-准备工作

建议申请5台机器部署elfk&#xff1a; filebeat(每台app)--> logstash(2台keepalived)--> elasticsearch(3台)--> kibana(部署es上)采集输出 处理转发 分布式存储 展示 ELK中文社区: 搜索客&#xff0c;搜索人自己的社区 官方…

DeepSeek:我的AI助手之旅

★【前言】: 初次使用AI助手帮我写作,就像摸石头过河一样,一点点的前行。我在慢慢的摸索,慢慢的体会中,感悟出的一点个人心得体会现分享给大家。这也说明一个问题,网站上各种使用方法和技巧是对于已经使用过的人来说的方便和快捷,但对于刚刚接触的使用者来说,网上的各…

esp8266 rtos sdk开发环境搭建

1. 安装必要的工具 1.1 安装 Git Git 用于从远程仓库克隆代码&#xff0c;你可以从Git 官方网站下载 Windows 版本的安装程序。安装过程中可保持默认设置&#xff0c;安装完成后&#xff0c;在命令提示符&#xff08;CMD&#xff09;或 PowerShell 中输入git --version&#…

C# | GDI+图像测距辅助线的实现思路

C# | GDI图像测距辅助线的实现思路 文章目录 C# | GDI图像测距辅助线的实现思路一、辅助线需求概述二、坐标系与角度计算2.1 笛卡尔坐标系2.2 线长和角度计算方法2.3 文本角度矫正计算方法2.4 坐标变换实现步骤 三、与if判断方式对比四、总结 一、辅助线需求概述 在图像测量工…

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求&#xff0c;在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为&#xff1a;通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…

python编写liunx服务器登陆自动巡检脚本

前言&#xff1a; 用户需要一份用Python编写的Linux系统巡检脚本&#xff0c;检查内存、磁盘、CPU使用率&#xff0c;还有网络连通性。 首先&#xff0c;我得确定用户的使用场景。可能用户是系统管理员&#xff0c;需要定期监控服务器状态&#xff0c;确保系统正常运行。 或者…

【二分查找】P9698 [GDCPC2023] Path Planning|普及

本文涉及的基础知识点 本博文代码打包下载 C二分查找 [GDCPC2023] Path Planning 题面翻译 【题目描述】 有一个 n n n 行 m m m 列的网格。网格里的每个格子都写着一个整数&#xff0c;其中第 i i i 行第 j j j 列的格子里写着整数 a i , j a_{i, j} ai,j​。从 0…