套接字选项SO_KEEPALIVE是保活套接字,它会在规定的时间内给对端发送探测分节,用tcpdump抓包可以看到。这个规定的时间就是net.ipv4.tcp_keepalive_time,在系统中可以动态的设置它,它的默认值是7200s。SO_KEEPLIVE选项由setsockopt函数进行设置。

服务端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <time.h>int main()
{int sockSrv = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_addr.s_addr =htonl(INADDR_ANY);addrSrv.sin_port = htons(8888);bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));listen(sockSrv, 5);sockaddr_in addrClient;socklen_t len=sizeof(addrClient);int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, &len);int keepAlive=1;setsockopt(sockConn,SOL_SOCKET,SO_KEEPALIVE,(void *)&keepAlive,sizeof(keepAlive));getchar();close(sockConn);close(sockSrv);return 0;
}

客户端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <error.h>int main()
{int ret=0;int sockClient = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addrSrv;addrSrv.sin_addr.s_addr=inet_addr("127.0.0.1");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(8888);ret=connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));getchar();close(sockClient);return 0;
}

tcpdump抓包结果:

[root@localhost mapan]# tcpdump -iany port 8888 -nlps0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
13:57:50.484437 IP 127.0.0.1.40596 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 2495400572, win 65495, options [mss 65495,sackOK,TS val 3129736193 ecr 0,nop,wscale 7], length 0
13:57:50.484453 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.40596: Flags [S.], seq 1098484178, ack 2495400573, win 65483, options [mss 65495,sackOK,TS val 3129736193 ecr 3129736193,nop,wscale 7], length 0
13:57:50.484471 IP 127.0.0.1.40596 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3129736193 ecr 3129736193], length 0
13:59:50.483791 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.40596: Flags [.], ack 1, win 512, options [nop,nop,TS val 3129856193 ecr 3129736193], length 0
13:59:50.483802 IP 127.0.0.1.40596 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3129856193 ecr 3129736193], length 0
14:01:50.483787 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.40596: Flags [.], ack 1, win 512, options [nop,nop,TS val 3129976193 ecr 3129856193], length 0
14:01:50.483798 IP 127.0.0.1.40596 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3129976193 ecr 3129736193], length 0

服务端每2分钟会发送一个探测分节给客户端,客户端以相应的ACK回应,标明客户端一切正常。

套接字选项SO_KEEPALIVE相关推荐

  1. 字选项套接字选项-java教程

    今天一直在研究字选项之类的问题,现在正好有机会和大家分享一下. ================================================  套接字机制供给了两个套接字选项接口来 ...

  2. linux 套接字选项定义

    2019独角兽企业重金招聘Python工程师标准>>> linux 套接字选项定义 2011-07-28 14:31 1.closesocket(一般不会立即关闭而经历TIME_WA ...

  3. socket套接字选项

    socket.setsockopt(level, optname, value) ↑ ↑ ↑ →[SO_KEEPALIVE ,   ↑  SO_LINGER , ↑   SO_RCVBUF , ↑  ...

  4. 常用套接字选项(SOL_SOCKET级别)

    setsockopt方法 [cpp] view plaincopyprint? #include int setsockopt( int socket, int level, int option_n ...

  5. 套接字选项SO_LINGER

    在说明套接字选项SO_LINGER之前,我们来先看一个问题.如果发送缓冲区中还有数据没有发送到对方协议栈,此时close发送端的socket会发生什么,下面代码给出答案. 服务端: #include ...

  6. Linux 套接字编程 套接字选项SO_BINDTODEVICE 绑定接口 示例

    man socket(7)里对该选项的描述: SO_BINDTODEVICEBind this socket to a particular device like "eth0", ...

  7. UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

    有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt(int sockfd,int level,int optname,void *op ...

  8. TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项

    基本概念: SO_REUSEADDR套接字选项能起到以下4个不同的功用: (1)SO_REUSEADDR允许启动一个监听服务器并捆绑众所周知端口,即使以前建立的该端口用作它们的本地端口的连接仍存在. ...

  9. 教你使用 SO_REUSEPORT 套接字选项提升服务性能

    前言 Linux 网络栈中有一个相对较新的特性--SO_REUSEPORT 套接字选项,可以使用它来提升你的服务性能. 图 1: 上面的服务是使用并行监听器来避免请求连接瓶颈,而下面的服务只使用一个监 ...

最新文章

  1. 只看到了别人28岁退休,背后的期权知识你知道吗?
  2. Alpha多样性稀释曲线rarefraction curve还不会画吗?快看此文
  3. win10运行在哪里_升级!Win10 2004版即将推送,减少CPU占用率,旧电脑也运行如飞...
  4. easyui js解析字符串_easyui的解析器Parser
  5. 300米远程深度估计:港科大重磅开源自动驾驶深度感知新技术,远超现有雷达|CVPR2020
  6. 【Java 虚拟机探索之路系列】:JIT编译器
  7. Docker 常用命令备忘录
  8. 雷军宣布:启动小米成立以来最大组织架构变革(附内部邮件原文)
  9. LongAdder源码分析
  10. js处理DataSet数据源
  11. thymeleaf 的hello world
  12. c语言手机表白代码大全,C语言表白代码
  13. 使用shell脚本实现二进制、十进制、十六进制转换
  14. 浅谈个人对项目管理的理解
  15. 【C#】Winform常用属性和事件笔记大全(入门者参考)
  16. JavaWeb分页显示内容和数据库分页查询
  17. 截止失真放大电路_BJT的失真
  18. 3DsMax导出插件编写(二)——常规SDK方法进行信息获取和保存文件
  19. Drupal7导入语言包
  20. vmware全屏后退出全屏快捷键

热门文章

  1. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
  2. MySql中常用的内置函数
  3. myeclise 安装
  4. 终于好像懂motan了!!!
  5. update与merge
  6. C算法编程题(四)上三角
  7. SYSENTER、SYSEXIT—快速系统调用
  8. 【Oracle 学习笔记】Day 2 视图、序列、同义词
  9. 最详细的CISCO路由器配置命令及方法
  10. DNS解析与Bind的使用(2)