windows线程检测主机信息更改

来源:互联网 发布:usb v2.0数据接口 编辑:程序博客网 时间:2024/06/04 18:23

适用于本机的主机信息更改检测,包括地址类型,ip,子网掩码和网关等

#include <iostream>#include <windows.h>#include <process.h>#include <iphlpapi.h>#pragma comment(lib, "Iphlpapi.lib")using namespace std;#define MSG_USER_A  WM_USER+1typedef UINT (WINAPI* BEGINTHREADEX_FUNC)(LPVOID param);typedef UINT *BEGINTHREADEX_THREADID;class IPChangeDectector{public:void InitInstance();void ReleaseInstance();void HandleSpecailEvent(){}void HandleIPChangeEvent() { std::cout<<"detected ip changed..."<<endl;}void OnTimeOut(){cout<<"time out..."<<endl;}DWORD ThreadProc();static DWORD WINAPI _ThreadProc(LPVOID lParam){return ((IPChangeDectector*)lParam)->ThreadProc();}private:HANDLE m_hThread;DWORD m_dwThreadID;HANDLE m_hSomeSpecialEvt;};void IPChangeDectector::InitInstance(){m_hSomeSpecialEvt = CreateEvent(NULL, TRUE, FALSE, NULL);m_hThread = (HANDLE)_beginthreadex(NULL, 0, (BEGINTHREADEX_FUNC)_ThreadProc, this, 0, (BEGINTHREADEX_THREADID)&m_dwThreadID);}void IPChangeDectector::ReleaseInstance(){if(m_hThread!=NULL){PostThreadMessage(m_dwThreadID,WM_QUIT,0,0);WaitForSingleObject(m_hThread,INFINITE);CloseHandle(m_hThread);m_hThread = NULL;}CloseHandle(m_hSomeSpecialEvt);m_hSomeSpecialEvt = NULL;}DWORD IPChangeDectector::ThreadProc(){MSG msg;BOOL bRunning;BOOL bWaiting;DWORD dwRet;HANDLE hNotifyChange;HANDLE hIPChangeEvt = CreateEvent(NULL, TRUE, FALSE, NULL);OVERLAPPED overlapped;ZeroMemory(&overlapped, sizeof(OVERLAPPED));overlapped.hEvent = hIPChangeEvt;DWORD dwErr = NotifyRouteChange(&hNotifyChange, &overlapped);if( dwErr != ERROR_IO_PENDING ){goto cleanup;}ResetEvent(hIPChangeEvt);HANDLE hWaitHandles[2];hWaitHandles[0] = m_hSomeSpecialEvt;hWaitHandles[1] = hIPChangeEvt;bRunning = TRUE;while(bRunning){//处理消息while(PeekMessage(&msg,0,0,0,PM_NOREMOVE)){bRunning = GetMessage(&msg, 0, 0, 0);if(!bRunning) break;switch (msg.message){case MSG_USER_A://do some thingbreak;default:DispatchMessage(&msg);}}//while(PeekMessage...)if(!bRunning) break;bWaiting = TRUE;while(bWaiting){//等待消息或连接进入dwRet = MsgWaitForMultipleObjects(2,hWaitHandles,FALSE,1000,QS_ALLINPUT);switch(dwRet){case WAIT_OBJECT_0://hSomeEvt{HandleSpecailEvent();//;}break;case WAIT_OBJECT_0+1://hIPChangeEvt{//do something when ip changedHandleIPChangeEvent();//reset statusResetEvent(hIPChangeEvt);if(NotifyRouteChange(&hNotifyChange, &overlapped) != ERROR_IO_PENDING){bWaiting = FALSE;bRunning =FALSE;}}break;case WAIT_OBJECT_0+2:bWaiting = FALSE;break;case WAIT_TIMEOUT:OnTimeOut();break;default://发生错误bRunning = FALSE;bWaiting = FALSE;break;}}}//while(bRunning)cleanup:CancelIo(hNotifyChange);if (hNotifyChange)CloseHandle(hNotifyChange);if (hIPChangeEvt)CloseHandle(hIPChangeEvt);return 0;}int _tmain(int argc, _TCHAR* argv[]){IPChangeDectector d;d.InitInstance();getchar();d.ReleaseInstance();return 0;}


0 0