Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大。本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线会话记录中的计数标志值来实现心跳异常的检测,以此决定客户端是否已经断开连接以及删除其在线会话记录。
基本思路:
- 客户端定时给服务器发送心跳包(案例中定时时间为3秒);
- 服务器创建一个心跳检测的线程,线程中每隔3秒对用户在线会话记录中的计数器进行加1操作(初始值为0);
- 服务器每次收到客户端的心跳包后,都将其在线会话记录中的计数器清零;
- 当心跳检测线程中检测到某用户计数器已经累加到数值为5时(说明已经有15秒未收到该用户心跳包),就判定该用户已经断线,并将其从会话记录中清除出去。
(注:案例中的会话记录是用链表实现的)
/*
**功能:客户端心跳包发送线程函数
**参数:线程传参(可传套接字)
**返回值:空
*/
void *send_heart(void *addr)
{
while(){
pd->data_type = HEART; //HEART:数据包类型,pd为数据包结构体指针
write(client_sockfd,pd,sizeof(DATA_PACK));
sleep(); //定时3秒
}
return NULL;
}
服务端
typefdef struct session{
char peerip[];
char name[];
int sockfd;
int count;
struct session *next;
}s_t;
/*
**功能:处理用户心跳包事件,将其会话记录中的计数器清零
**参数:套接字和数据包指针
**返回值:无
*/
void heart_handler(int sockfd,DATA_PACK *pd)
{
s_t *cur = shead->next; // shead为用户在线会话记录全局变量头指针
while( NULL != cur){
if(strcmp(cur->name,pd->name) == ){
cur->count = ; //将计数器清零,表明用户名为pd->name的客户端还活着
printf("客户端IP: %s :用户 %s 连接正常\n",cur->peerip,pd->name);
}
cur = cur->next;
}
}
/*
**功能:心跳检测线程函数
**参数:无
**返回值:无
*/
void *heart_check(void *p)
{
printf("心跳检测线程已开启!\n");
while(){
check_handler(); // 心跳检测处理函数
sleep(); //定时3秒
}
return NULL;
}
/*
**功能:心跳检测处理函数
**参数:无
**返回值:无
*/
void check_handler(){
s_t *temp = NULL; // 用于释放结点
s_t **ppNode = &shead->next;
while(NULL != (*ppNode)){
if((*ppNode)->count == ){
printf("客户端IP: %s :用户 %s 已经掉线!!\n",(*ppNode)->peerip,(*ppNode)
->name);
close((*ppNode)->sockfd); //关闭对端套接字
temp = *ppNode; //存储本结点地址
*ppNode = (*ppNode)->next; //移动指针
free(temp); //释放结点
temp = NULL;
continue;
}
else if((*ppNode)->count > ){
printf("客户端IP: %s :用户 %s 连接异常!\n",(*ppNode)->peerip,(*ppNode)-
>name);
(*ppNode)->count++;
printf("count = %d\n",(*ppNode)->count); //查看计数器内容
ppNode = &((*ppNode)->next); // 成员指针
continue;
}
else if((*ppNode)->count == ){
(*ppNode)->count++;
printf("count = %d\n",(*ppNode)->count); //查看计数器内容
ppNode = &((*ppNode)->next); // 成员指针
}
else;
}
}
Socket心跳包异常检测的C语言实现,服务器与客户端代码案例的更多相关文章
- [转] Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
转载自:zxh2075的专栏 在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大.本文实现的是由客户端给服务器发送心跳包,服务器不必返 ...
- web socket 心跳包的实现方案
web socket 心跳包的实现方案05/30/2010 现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我 ...
- socket 心跳包机制
心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动 ...
- Socket心跳包机制【转】
转自:https://blog.csdn.net/xuyuefei1988/article/details/8279812 心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己 ...
- Socket心跳包机制
心跳包的发送,通常有两种技术方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个 ...
- TCP socket心跳包示例程序
在做游戏开发时,经常需要在应用层实现自己的心跳机制,即定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性. 在TCP socket心跳机制中,心跳包可以由服务器发送给客户端 ...
- socket心跳包机制实践与理解
实现Socket心跳包主要分为两大类,第一采用tcp自带的KeepAlive,第二是自定义心跳包,恰巧我在产品VICA中都使用过,下面就这两种心跳包机制谈谈个人的理解与感受. 首先第一种KeepAli ...
- Socket心跳包机制总结【转】
转自:https://blog.csdn.net/qq_23167527/article/details/54290726 跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器, ...
- Socket 心跳包机制总结
跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着.事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一 ...
随机推荐
- PHP FILTER_SANITIZE_ENCODED 过滤器
定义和用法 FILTER_SANITIZE_ENCODED 过滤器去除或 URL 编码不需要的字符. 该过滤器与 urlencode() 函数很类似. Name: "encoded" ...
- PHP中关于Phar的学习
什么是phar 一个PHP程序往往是由多个文件组成的,如果能够集中为一个文件来分发和运行是很方便的.phar便应运而生.大概跟java的jar文件是差不多类似的.但是php的phar文件是可以由php ...
- Openfire调整成自己的IM部署到LInux系统上
部署自己的IM到Linux系统下:需要生成相关jar包再部署 1.在myeclipse上把openfire源代码加在加载进来,做相应调整后,运行测试没问题 2. 编译admin-jsp.jar(所有 ...
- Selenium2Library中select frame关键字对没有name和id的frame或者iframe的处理
elenium2Library中原有的select_frame函数(对应的关键字为select frame)可根据locator选择frame,但是,若某个frame或者iframe没有id,没有na ...
- 剑指offer——42最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题解: 原以为书中会有好方法,想不到还是排序和STL这两种方法 ...
- DQL 数据查询语言 select
1.select 1.select 单独使用 (1) 查询数据库的参数 查看端口: select @@port; 查看数据路径 select @@datadir; (2)调用内置函数 查看当前库 se ...
- babel/core 6.x升级到7.x要碰到的一些坑
刚学习react.js没多久,碰到各种坑.就比如这个问题,弄了我3个小时,终于解决了.其实就是一个小问题. 报错信息: Error: Cannot find module '@babel/core' ...
- 冲上云霄,Dubbo Go!
来源:开源中国社区 5 月 21 日,经过一年多的孵化,Apache Dubbo 从 Apache 软件基金会毕业,成为 Apache 顶级项目.推荐:厉害了,Dubbo 正式毕业! Dubbo 是阿 ...
- 「SNOI2019」通信 分治优化费用流建图
题意: n 个排成一列的哨站要进行通信.第 i 个哨站的频段为 ai. 每个哨站 ii 需要选择以下二者之一: 1.直接连接到控制中心,代价为 W:2.连接到前面的某个哨站 j(j<i),代价为 ...
- 如果手工启动chromedriver
使用selenium模拟登陆网站时,有些网站会识别chrome driver里的json信息,从而判断是不是爬虫程序,做到反爬效果.(比如知乎) 下面说明下怎么手动启动chromedriver 1). ...