客戶端SOCKET心跳包檢測

2021-08-20 01:21:11 字數 1635 閱讀 7877

socket 長時間連線我們往往需要心跳包檢測,我用計數器的形式做了乙個簡單的心跳包檢測,主要是檢測io 如果io超過一定時間全是失敗,那麼我就可以初步斷定這個socket有問題,那麼我們就可以斷定這個socket死掉了,重新初始化socket變數

定義乙個全域性變數

socket socketflag;
定義乙個計數器結構體

typedef struct _timepack timepack;

timepack timer;

封裝乙個socket連線的函式

bool initsocket()

hostent* hostentinfo = gethostbyname((lpstr)(lpcstr)screen_ip);

if (hostentinfo == 0)

cstring stripaddress;

stripaddress.format(_t("%d.%d.%d.%d"),

(hostentinfo->h_addr_list[0][0] & 0x00ff),

(hostentinfo->h_addr_list[0][1] & 0x00ff),

(hostentinfo->h_addr_list[0][2] & 0x00ff),

(hostentinfo->h_addr_list[0][3] & 0x00ff));

sockaddr_in socket_server;

socket_server.sin_family = af_inet;

socket_server.sin_port = htons(8555);

socket_server.sin_addr.s_un.s_addr = inet_addr(stripaddress);

if (int result = connect(socketflag, (sockaddr*)&socket_server, sizeof(sockaddr)) == socket_error) ;

return true;

}

傳送執行緒檢測心跳包**

傳送執行緒

void requestfun(socket socketclient)

cstring send_info = "download_file|" + screen_id + "|" + soft_version + "&";

int sendresult = send(socketclient, (pstr)(pcstr)send_info, send_info.getlength(), 0);

if (sendresult <= 0)

else

}else

}else

//放鎖

releasemutex(hmutex);

}sleep(10000);

}return;

}

思路: 寫乙個計數器結構體,由於客戶端是兩個執行緒,所以結構體裡放了兩個標誌位,收發執行緒的標誌位,掛起迴圈10秒傳送一次,如果連續傳送失敗5次,count到達5,說明50秒了都沒有傳送成功過,那麼久關閉鏈結重新進行socket初始化,改變全域性變數的存放檔案描述符的變數,達到乙個重新鏈結的效果

客戶端檢測

在理想狀態下,我們會認為瀏覽器應該支援一組最常用的公共功能,但是現實時瀏覽器之間有存在差異以及特的 怪癖 quirk 因此客戶端檢測除了是一種補救措施之外,更是一種行之有效的開發策略。主要有以下三種客戶端檢測方法 1.能力檢測 在編寫 之前先檢測特定的瀏覽器的能力。例如,指令碼在呼叫某個函式之前,可...

客戶端檢測

一 客戶端檢測的原因 瀏覽器之間存在不同差別,通常需要根據不同的瀏覽器的能力分別編寫不同的 客戶端檢測除了是一種補救措施之外,更是一種行之有效的開發策略。客戶端檢測分為能力檢測 怪癖檢測 使用者 檢測。二 能力檢測 在編寫 之前先檢測特定的瀏覽器的能力,例如,指令碼在呼叫某個函式之前,可能要先檢測該...

SOCKET客戶端程式設計

1.建立socket物件 socket建構函式有4個引數,第乙個是family,代表位址家族af net,af net6等,第二個是type,套接字型別sock stream 流套接字 和sock dgram 資料報套接字 import socket s socket.socket socket.a...