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...