网络超时检测、心跳检测的方法

本文介绍在网络通信中如何实现超时检测和心跳检测,包括通过设置套接字属性、使用select模型和信号检测进行超时检测的方法,以及通过定期发送检测报文和设置套接字属性进行心跳检测的技术。

在网络通信中很多操作都是默认阻塞的,比如 recv函数,当接收缓冲区中的数据没有达到水位线时,上层会一直处在阻塞等待数据就绪的状态。出现这种情况的原因有两个,一个是数据没有就绪,一个是网络连接断开。

  • 超时检测:当数据没有就绪时,避免当前进程在某个位置无限制的阻塞
  • 心跳检测:定时检查网络连接是否断开

        目录

1、网络超时检测

(1) 设置套接字属性

(2) 通过select模型检测

(3) 信号检测

2、心跳检测

(1) 定期发送检测报文

(2) 设置套接字属性


1、网络超时检测

(1) 设置套接字属性

可以使用 setsockopt 函数来设置套接字属性,setsockopt函数的第三个参数有一个 SO_RCVTIMEO 选项来设置接收超时时间。

struct timeval tout;
tout.tv_sec = 5;
tout.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tout, sizeof(struct timeval));

recv();        // 从接收缓冲区读取数据

(2) 通过select模型检测

select模型是五种IO模型中的一种,它会逐个遍历每一个文件描述符,并判断文件描述符是否读就绪或者写就绪。

struct fd_set rdfs;
struct timeval tv = {5, 0};    // 设置select模型阻塞等待时间

FD_ZERO(&rdfs);
FD_SET(sockfd, &rdfs);

if(select(sockfd+1, &rdfs, NULL, NULL, &tv) > 0){    
    recv();            // 从接收缓冲区读取数据
}

(3) 信号检测

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值