Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
来源:互联网 发布:命令行更新ubuntu系统 编辑:程序博客网 时间:2024/04/28 22:38
在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大。本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线会话记录中的计数标志值来实现心跳异常的检测,以此决定客户端是否已经断开连接以及删除其在线会话记录。
基本思路:①客户端定时给服务器发送心跳包(案例中定时时间为3秒);
②服务器创建一个心跳检测的线程,线程中每隔3秒对用户在线会话记录中的计数器进行加1操作(初始值为0);
③服务器每次收到客户端的心跳包后,都将其在线会话记录中的计数器清零;
④当心跳检测线程中检测到某用户计数器已经累加到数值为5时(说明已经有15秒未收到该用户心跳包),就判定该用户已经断线,并将其从会话记录中清除出去。
(注:案例中的会话记录是用链表实现的)
C语言代码实现案例:
客户端:/***功能:客户端心跳包发送线程函数**参数:线程传参(可传套接字)**返回值:空*/void *send_heart(void *addr){while(1){pd->data_type = HEART; //HEART:数据包类型,pd为数据包结构体指针write(client_sockfd,pd,sizeof(DATA_PACK));sleep(3); //定时3秒}return NULL;}/***********************************************//***********************************************/服务器端:typefdef struct session{char peerip[16];char name[10];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) == 0){cur->count = 0; //将计数器清零,表明用户名为pd->name的客户端还活着printf("客户端IP: %s :用户 %s 连接正常\n",cur->peerip,pd->name);} cur = cur->next;}}/***功能:心跳检测线程函数**参数:无**返回值:无*/void *heart_check(void *p){printf("心跳检测线程已开启!\n");while(1){check_handler(); // 心跳检测处理函数sleep(3); //定时3秒}return NULL;}/***功能:心跳检测处理函数**参数:无**返回值:无*/void check_handler(){ s_t *temp = NULL; // 用于释放结点 s_t **ppNode = &shead->next; while(NULL != (*ppNode)){ if((*ppNode)->count == 5){ 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 > 0){ 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 == 0){ (*ppNode)->count++; printf("count = %d\n",(*ppNode)->count); //查看计数器内容 ppNode = &((*ppNode)->next); // 成员指针 } else; } }
基本思想清晰了,程序思路也就会很明朗,第一次写博客,望各位不吝赐教!
1 0
- Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
- Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
- C语言实现服务器与客户端的socket通信运行在linux系统中
- C语言实现服务器与客户端的socket通信运行在linux系统中 .
- 使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端
- Android socket与服务器通信及心跳连接的实现
- 刚学JAVA,做了个SOCKET服务器心跳包,只能实现正常心跳检测,无法实现心跳停止,短信通知管理员!想知道怎么改才正确!
- delphi中 socket 心跳包的实现
- WinSock2简单的服务器与客户端(C语言实现)
- C语言实现基本服务器与客户端
- 通过netty实现服务端与客户端的长连接通讯,及心跳检测。
- java socket实现心跳包
- android socket 实现心跳包
- ioS之Socket心跳包机制与实现
- ios之Socket心跳包机制与实现
- ioS之Socket心跳包机制与实现
- Android socket通信的长连接与心跳检测
- TCP通信客户端Socket 心跳线程的实现
- 隐藏任意一个分区图标,个人已验证技术贴
- 可变参数的使用
- nyoj 49 开心的小明 【DP】【01背包】
- Android Service 服务(二)—— BroadcastReceiver
- 重要的电子商务推广策略
- Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
- treectl 的使用
- iOS判断当前是否有网络
- Linux文件共享(二)——两个独立进程打开同一个文件
- 如何使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(4)
- [LeetCode] Convert Sorted Array to Binary Search Tree
- 程序员到项目经理分类:
- Android Service 服务(三)—— bindService与remoteService
- 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-6.对话框)