[转] Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
转载自:zxh2075的专栏
在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大。本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线会话记录中的计数标志值来实现心跳异常的检测,以此决定客户端是否已经断开连接以及删除其在线会话记录。
基本思路:
①客户端定时给服务器发送心跳包(案例中定时时间为3秒);
②服务器创建一个心跳检测的线程,线程中每隔3秒对用户在线会话记录中的计数器进行加1操作(初始值为0);
③服务器每次收到客户端的心跳包后,都将其在线会话记录中的计数器清零;
④当心跳检测线程中检测到某用户计数器已经累加到数值为5时(说明已经有15秒未收到该用户心跳包),就判定该用户已经断线,并将其从会话记录中清除出去。
(注:案例中的会话记录是用链表实现的)
C语言代码实现案例:
客户端: /*
**功能:客户端心跳包发送线程函数
**参数:线程传参(可传套接字)
**返回值:空
*/
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语言实现,服务器与客户端代码案例
在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 心跳包机制总结
跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着.事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一 ...
随机推荐
- BZOJ4003:[JLOI2015]城池攻占——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 https://www.luogu.org/problemnew/show/P3261 小铭 ...
- ural1297 求最长回文子串 | 后缀数组
#include<cstdio> #include<algorithm> #include<cstring> #define N 20005 using names ...
- lnmp架构 实现lbs资料参考
查找附近的xxx 球面距离以及Geohash方案探讨 http://www.wubiao.info/372 http://digdeeply.org/archives/06152067.html
- printf函数用法小记
By francis_hao Aug 26,2017 C语言中printf函数是一个比较常用的函数,但是常用并不代表完全了解,本文翻译了printf的man手册,介绍了其全部功能(不包括ma ...
- caffe数据集——LMDB
LMDB介紹 Caffe使用LMDB來存放訓練/測試用的數據集,以及使用網絡提取出的feature(為了方便,以下還是統稱數據集).數據集的結構很簡單,就是大量的矩陣/向量數據平鋪開來.數據之間沒有什 ...
- UVA796:Critical Links(输出桥)
Critical Links 题目链接:https://vjudge.net/problem/UVA-796 Description: In a computer network a link L, ...
- redis 查看所有键值
zb@zb-computer:/home/wwwroot/default/lion/Admin$ /usr/local/redis/bin/redis-cli 127.0.0.1:6379> k ...
- jquery动画切换引擎插件 Velocity.js 学习02
案例实践: 第一页会以动画形式进入页面: 点击进入按钮时,第一页以动画消失,第二页以动画形式进入,同时四张图片也定义从小到大的动画形式: 第二页关闭按钮点击时,先是四张图片以缩小动画消失,然后第二页以 ...
- struts2常用标签之数据标签
数据标签1 property标签 property标签的主要属性: value:用来获取值的OGNL表达式,如果value属性值没有指定,那么将会被设定为top,也就是返回位于值栈最顶端的对象. ...
- Flash Sort
FlashSort依然类似桶排,主要改进了对要使用的桶的预测,或者说,减少了无用桶的数量从而节省了空间,例如 待排数字[ 6 2 4 1 5 9 100 ]桶排需要100个桶,而flash sort则 ...