socket心跳包异常检测的c语言实现,服务器与客户端代码案例 -ag凯发k8国际
ag凯发k8国际
收集整理的这篇文章主要介绍了
socket心跳包异常检测的c语言实现,服务器与客户端代码案例
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
在socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大。本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线会话记录中的计数标志值来实现心跳异常的检测,以此决定客户端是否已经断开连接以及删除其在线会话记录。
基本思路:
(注:案例中的会话记录是用链表实现的)
/* **功能:客户端心跳包发送线程函数 **参数:线程传参(可传套接字) **返回值:空 */ 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;} }
转载于:https://www.cnblogs.com/cnkker/p/11125071.html
总结
以上是ag凯发k8国际为你收集整理的socket心跳包异常检测的c语言实现,服务器与客户端代码案例的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: