欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程资源 > 编程问答 >内容正文

编程问答

socket心跳包异常检测的c语言实现,服务器与客户端代码案例 -ag凯发k8国际

发布时间:2024/10/12 编程问答 14 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 socket心跳包异常检测的c语言实现,服务器与客户端代码案例 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大。本文实现的是由客户端给服务器发送心跳包,服务器不必返回应答包,而是通过判断客户在线会话记录中的计数标志值来实现心跳异常的检测,以此决定客户端是否已经断开连接以及删除其在线会话记录。

基本思路:

  • 客户端定时给服务器发送心跳包(案例中定时时间为3秒);
  • 服务器创建一个心跳检测的线程,线程中每隔3秒对用户在线会话记录中的计数器进行加1操作(初始值为0);
  • 服务器每次收到客户端的心跳包后,都将其在线会话记录中的计数器清零;
  • 当心跳检测线程中检测到某用户计数器已经累加到数值为5时(说明已经有15秒未收到该用户心跳包),就判定该用户已经断线,并将其从会话记录中清除出去。
  • (注:案例中的会话记录是用链表实现的)

     

    /* **功能:客户端心跳包发送线程函数 **参数:线程传参(可传套接字) **返回值:空 */ 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语言实现,服务器与客户端代码案例的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

    • 上一篇:
    • 下一篇:
    网站地图