
文章插圖
大家好,小耶來為大家解答以上的問題 。keepalive緩存組件,keepalive這個很多人還不知道,現在讓我們一起來看看吧!
1、7.2.6KeepAlive的添加下面是KeepAlive模塊的添加,KeepAlive模塊指的是在客戶端電腦電源突然中斷的情況下,為了確認客戶端是否結束而定期傳送的信號 。
2、如果出現了上面的情況,IOCP或者EventSelect無法測試OnIoDisconnected , 因此必須定期傳送數據包通過確認是否傳送失敗來確認是否訪問中斷 。
【keepalive keepalive緩存組件】3、(ConnectedSession.h) #pragma once//繼承CPacketSession的CConnectedSessionclass CConnectedSession : public CPacketSession { . . . BOOL ReStart (SOCKET hListenSocket ) ;//設置并獲得m_bConnected值的函數VOID SetConnected(BOOL bConnected) { CThreadSync Sync ; m_bConnected = bConnected; } BOOL GetConnected(VOID) { CThreadSync Sync; return m_bConnected; } private://判斷是否被訪問的變量BOOL m_bConnected}; () CConnectedSession: :CConnectedSession(VOID) {//判斷是否被訪問的變量m_bConnect ed = FALSE; } (ConnectedSessionManager.h) #pragma once//管理ConnectedSession的類//為了在多線程環境中使用更加穩定 , 繼承CMultiThreadSyncclass CConnectedSessionManager : public CMultiThreadSync< CConnectedSessionManager> { . . . VOID End(VOID) ;//給訪問的所有ConnectedSession傳送數據包的函數VOID WriteAll (DWORD dwProtocol , BYTE *pData , DWORD dwLength) ; private: . . . };()//給訪問的所有Session傳送數據的函數VOID CConnectedSessionManager : :WriteAll (DWORD dwProtocol , BYTE *pData, DWORD dwLength) {//同步對象CThreadSync Sync ;//對訪問的所有對象進行WritePacketfor (DWORD i =0;i
GetConnected()) m_vConnectedSessions[i ] ->WritePacket (dwProtocol , pData, dwLength) ; } } (ServerIocp.h) #pragma once//繼承CIocpclass CServerIocp : public CIocp { . . . VOID End(VOID) ;//KeepAlive Thread Callback函數VOID KeepThreadCallback(VOID) ; . . . CConnectedSessionManager m_oConnectedSessionManager ;//管理KeepAlive Thread的句柄HANDLE m_hKeepThread; //結束KeepAlive Thread時使用的事件HANDLE m_hKeepThreadDestroyEvent ; }; ()//KeepAlive Thread Callback函數DWORD WINAPI KeepThreadCallback(LPVOID pParameter) { CServerIocp *pOwner = (CServerIocp*) pParameter ; pOwner->KeepThreadCallback() ; return 0; } VOID CServerIocp: :KeepThreadCallback(VOID) {//KeepAlive信號DWORD dwKeepAl ive = 0xFFFF; while (TRUE) {//30秒內結束事件沒有出現的話,將跳過DWORD dwResult = WaitForSingleObject (m_hKeepThreadDestroyEvent , 30000) ;//結束時間出現的情況下,結束Threadif (dwResult == WAIT_OBJECT_0) return;//給訪問中的所有Session傳送數據包m_oConnect edSessionManager .WriteAll (0x3000000, (BYTE*)&dwKeepAlive , sizeof (DWORD)) ; } }//CIocp的假想函數VOID CServerIocp: :OnIoConnected(VOID *pObject ) { . . . pConnectedSession->SetConnected(TRUE) ; } VOID CServerIocp: :OnIoDisconnected(VOID *pObject ) { . . . pConnectedSession->SetConnected(FALSE) ; } BOOL CServerIocp: :Begin(VOID) { . . .//創建KeepAlive結束事件m_hKeepThreadDestroyEvent = CreateEvent (NULL, FALSE, FALSE, NULL) ; if ( !m_hKeepThreadDestroyEvent ) {//失敗的情況下結束CServerIocp: :End() ; return FALSE; } //創建KeepAlive Threadm_hKeepThread = CreateThread(NULL, 0, : :KeepThreadCallback, this, 0, NULL) ; if ( !m_hKeepThread) {//創建失敗的情況下結束CServerIocp: :End() ; return FALSE; } return TRUE; } VOID CServerIocp: :End(VOID) {//結束CServerIocp的時候//m_hKeepThread不是NULL的話,結束KeepAlive Threadif (m_hKeepThread) {//出現結束事件SetEvent (m_hKeepThreadDestroyEvent ) ;//等待至Thread結束為止WaitForSingleObject (m_hKeepThread, INFINITE) ;//關閉句柄CloseHandle(m_hKeepThread) ; m_hKeepThread = NULL; }//如果KeepAlive結束事件不是NULL的話if (m_hKeepThreadDestroyEvent ) {//關閉事件CloseHandle(m_hKeepThreadDestroyEvent ) ; m_hKeepThreadDestroyEvent = NULL; 。
本文到此分享完畢,希望對大家有所幫助 。