[转] 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 心跳包机制总结
跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着.事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一 ...
随机推荐
- BZOJ4503 两个串 【fft】
题目链接 BZOJ4503 题解 水水题. 和残缺的字符串那题几乎是一样的 同样转化为多项式 同样TLE 同样要手写一下复数才A #include<algorithm> #include& ...
- 从零开始学Linux系统(三)安装CentOS-7及软件包管理操作
推荐博文: VirtualBox安装CentOS7步骤详解: https://my.oschina.net/AaronDMC/blog/840753 如何安装CentOS7字符界面 :http://b ...
- Promise用法总结
1. Promise的状态 Promise对象有三个状态: 1. 进行中(pending) 2. 成功(resolved) 3. 失败(rejected) 2. 生成一个Promise对象 ...
- 【图论】Floyd消圈算法
毫无卵用的百度百科 Definition&Solution 对于一个给定的链表,如何判定它是否存在环以及环的长度问题,可以使用Floyd消圈算法求出. 从某种意义上来讲,带环的链表在本质上是一 ...
- windows内存映射文件
http://shushanyegui.duapp.com/?p=731 在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序 #include "stdafx.h&q ...
- java.lang包学习(转自微学苑)
Java语言包(java.lang)定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明.该包中包含了Object类,Object类是整个类层次结构的根结点,同时还定义了基本数据类型 ...
- HDU3376 最小费用最大流 模板2
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)To ...
- Android Eclipse 开发环境搭建
因为开发工具版本 搭建 环境配置经常出现问题 再次用一篇随笔来做下记录 1 需要的工具jdk-6u45-windows-x64 //http://www.oracle.com/technetwork/ ...
- 双向数据绑定实现之Object.defineProperty
vue.js利用的是es5的 defineproperty 特性实现的双向数据绑定,了解一下基本原理. 举例 var person= {}; Object.defineProperty(person, ...
- Centos下Mysql密码忘记解决办法
1.修改MySQL的登录设置: # vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/m ...