Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的Socket心跳包异常检测的C语言实现,服务器与客户端代码案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月利率1.5%是高利贷吗
- 下一篇: 买保险,全面了解很重要