keepllive属性来检测网络连接的状态

本文介绍如何在Linux环境下正确设置Socket的Keepalive属性,并解释了TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT等参数的作用。通过添加必要的头文件,解决了编译时遇到的未定义错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用linux socket 的keepllive属性来检测网络连接的状态却发现编译时出现错误,TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT居然未定义。[喝小酒的网摘]http://blog.hehehehehe.cn/a/17673.htm
加上下面的头文件就可以了,其实TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT都是在tcp.h中定义的。


#include <sys/socket.h>

#include <netinet/in.h>
#include <netinet/tcp.h>

tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 

这三个状态的意思如下:

int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.


源码如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。
### 使用 Python Socket 的 SO_KEEPALIVE 选项 在 Python 中配置 `SO_KEEPALIVE` 可以帮助检测连接是否仍然有效,即使长时间没有数据传输。通过设置此选项可以防止死链接占用资源。 为了启用并调整 keepalive 参数,在创建套接字对象之后立即应用这些设置: ```python import socket import struct def set_keepalive(sock, after_idle_sec=1, interval_sec=3, max_fails=5): """Set TCP keepalive on an open socket. It activates after 1 second (after_idle_sec) of idleness, then sends a keepalive ping once every 3 seconds (interval_sec), and closes the connection after 5 failed ping (max_fails), or 15 seconds. """ sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # For Linux try: sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, after_idle_sec) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval_sec) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, max_fails) except AttributeError: pass # These options are not available on all platforms # For BSD/Darwin/MacOS/FreeBSD etc. try: sock.setsockopt(socket.IPPROTO_TCP, socket.SO_KEEPALIVE, interval_sec * 1000) except AttributeError: pass # For Windows try: sock.ioctl(socket.SIO_KEEPALIVE_VALS, ( 1, # Keepalives enabled after_idle_sec*1000, # After idle time in milliseconds interval_sec*1000 # Interval between probes in milliseconds )) except AttributeError: pass ``` 这段代码展示了如何跨不同操作系统平台设置 `TCP KEEPALIVE` 行为[^1]。 当客户端和服务端之间的网络连接可能因为防火墙或其他原因被意外切断时,这个特性非常有用。它允许应用程序及时发现断开的连接而不是等待超时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值