在网络通信中很多操作都是默认阻塞的,比如 recv函数,当接收缓冲区中的数据没有达到水位线时,上层会一直处在阻塞等待数据就绪的状态。出现这种情况的原因有两个,一个是数据没有就绪,一个是网络连接断开。
- 超时检测:当数据没有就绪时,避免当前进程在某个位置无限制的阻塞
- 心跳检测:定时检查网络连接是否断开
目录
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(); // 从接收缓冲区读取数据
}

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

被折叠的 条评论
为什么被折叠?



