當(dāng)前位置:
首頁 >
Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
發(fā)布時(shí)間:2024/10/12
36
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在Socket心跳機(jī)制中,心跳包可以由服務(wù)器發(fā)送給客戶端,也可以由客戶端發(fā)送給服務(wù)器,不過比較起來,前者開銷可能較大。本文實(shí)現(xiàn)的是由客戶端給服務(wù)器發(fā)送心跳包,服務(wù)器不必返回應(yīng)答包,而是通過判斷客戶在線會話記錄中的計(jì)數(shù)標(biāo)志值來實(shí)現(xiàn)心跳異常的檢測,以此決定客戶端是否已經(jīng)斷開連接以及刪除其在線會話記錄。
基本思路:
(注:案例中的會話記錄是用鏈表實(shí)現(xiàn)的)
?
/* **功能:客戶端心跳包發(fā)送線程函數(shù) **參數(shù):線程傳參(可傳套接字) **返回值:空 */ void *send_heart(void *addr) {while(1){pd->data_type = HEART; //HEART:數(shù)據(jù)包類型,pd為數(shù)據(jù)包結(jié)構(gòu)體指針write(client_sockfd,pd,sizeof(DATA_PACK));sleep(3); //定時(shí)3秒 }return NULL; }?
服務(wù)端
typefdef struct session{char peerip[16];char name[10];int sockfd;int count;struct session *next; }s_t;/* **功能:處理用戶心跳包事件,將其會話記錄中的計(jì)數(shù)器清零 **參數(shù):套接字和數(shù)據(jù)包指針 **返回值:無 */ 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; //將計(jì)數(shù)器清零,表明用戶名為pd->name的客戶端還活著printf("客戶端IP: %s :用戶 %s 連接正常\n",cur->peerip,pd->name);} cur = cur->next;} }/* **功能:心跳檢測線程函數(shù) **參數(shù):無 **返回值:無 */ void *heart_check(void *p) {printf("心跳檢測線程已開啟!\n");while(1){check_handler(); // 心跳檢測處理函數(shù)sleep(3); //定時(shí)3秒 }return NULL; }/* **功能:心跳檢測處理函數(shù) **參數(shù):無 **返回值:無 */ void check_handler(){ s_t *temp = NULL; // 用于釋放結(jié)點(diǎn) s_t **ppNode = &shead->next; while(NULL != (*ppNode)){if((*ppNode)->count == 5){ printf("客戶端IP: %s :用戶 %s 已經(jīng)掉線!!\n",(*ppNode)->peerip,(*ppNode)->name);close((*ppNode)->sockfd); //關(guān)閉對端套接字temp = *ppNode; //存儲本結(jié)點(diǎn)地址*ppNode = (*ppNode)->next; //移動(dòng)指針 free(temp); //釋放結(jié)點(diǎn)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); //查看計(jì)數(shù)器內(nèi)容ppNode = &((*ppNode)->next); // 成員指針continue;}else if((*ppNode)->count == 0){(*ppNode)->count++;printf("count = %d\n",(*ppNode)->count); //查看計(jì)數(shù)器內(nèi)容ppNode = &((*ppNode)->next); // 成員指針 }else;} }?
轉(zhuǎn)載于:https://www.cnblogs.com/CnKker/p/11125071.html
總結(jié)
以上是生活随笔為你收集整理的Socket心跳包异常检测的C语言实现,服务器与客户端代码案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月利率1.5%是高利贷吗
- 下一篇: 买保险,全面了解很重要