www.pudn.com > SnmpToplog.rar > MySubNet.cpp
// MySubNet.cpp: implementation of the CMySubNet class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MySnmp.h" #include "MySubNet.h" #include#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define NOT -1 //还没有搜索 #define DOING 0 //正在搜索活动主机 #define FINISH 1 //已经完成搜索活动主机 ////////////////////////////////////////////////////////////////////////// typedef struct { unsigned char Ttl; // Time To Live unsigned char Tos; // Type Of Service unsigned char Flags; // IP header flags unsigned char OptionsSize; // Size in bytes of options data unsigned char *OptionsData; // Pointer to options data }IP_OPTION_INFORMATION, * PIP_OPTION_INFORMATION; typedef struct { DWORD Address; // Replying address unsigned long Status; // Reply status unsigned long RoundTripTime; // RTT in milliseconds unsigned short DataSize; // Echo data size unsigned short Reserved; // Reserved for system use void *Data; // Pointer to the echo data IP_OPTION_INFORMATION Options; // Reply options } IP_ECHO_REPLY, * PIP_ECHO_REPLY; ////////////////////////////////////////////////////////////////////////// //全局函数,搜索该子网的活动主机 DWORD WINAPI ThreadProc(LPVOID lpParameter) { CMySubNet* pSub=(CMySubNet*)lpParameter; pSub->m_nState=DOING;//表示正在搜索 pSub->m_nActiveNumber; //该子网的活动主机数量 while(pSub->m_nCurrentIndex<=pSub->m_nMaxNumber) { char IP[20]; pSub->GetIpAddress(pSub->m_nCurrentIndex,IP); if(pSub->IsActive(IP)) { TRACE("%s 是活动的. \n",IP); pSub->m_nActiveNumber++; //pSub->UpdateList(); CString strActive(IP); pSub->AddActiveHost(strActive); //添加到活动主机数组中 } else { TRACE("%s 不活动. \n",IP); } pSub->m_nCurrentIndex++; } //搜索完整个子网,将该子网的状态设为已经完成搜索 pSub->m_nState=FINISH; pSub->UpdateList(); return 1; } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMySubNet::CMySubNet() { m_nState=NOT; m_nCurrentIndex=0; m_nActiveNumber=0; m_pList=NULL; m_pDlg=NULL; m_pActiveHostDlg=NULL; } CMySubNet::~CMySubNet() { } //获取该子网的最大主机数 void CMySubNet::GetMaxNumber() { int nFields[4]; m_nMaxNumber=1; int nCount=0; ChangeIPToInts(m_Mask,nFields[0],nFields[1],nFields[2],nFields[3]); for(int i=0;i<=3;i++) { if(nFields[i]<255) { for(int j=0;j<=7;j++) { if(nFields[i]%2 ==0) nCount++; nFields[i]/=2; } } } for(i=0;i GetMaxNumber(); //获取该子网的可能最大主机数 DWORD dID; m_hThread=NULL; m_hThread=CreateThread(NULL,0,ThreadProc,this,0,&dID); if(m_hThread==NULL) { AfxMessageBox("创建搜索线程错误!"); return; } } //停止搜索活动主机 BOOL CMySubNet::StopSearing() { if(m_hThread!=NULL) { if(!TerminateThread(m_hThread,-1)) return FALSE; } return TRUE; } void CMySubNet::GetIpAddress(int i, char *IP) { if(i<0) return; int n1,n2,n3,n4; ChangeIPToInts(m_Address,n1,n2,n3,n4); n4+=i; int nRet; if(n4>255) { nRet=n4/255; n4=n4%255; n3+=nRet; } if(n3>255) { nRet=n3/255; n3=n3%255; n2+=nRet; } if(n2>255) { nRet=n2/255; n2=n2%255; n1+=nRet; } if(n1>255) { return; } sprintf(IP,"%d.%d.%d.%d",n1,n2,n3,n4); } //开启定时器 BOOL CMySubNet::SetTimer() { UINT m_ID=::SetTimer(NULL,411,1000,(TIMERPROC)TimerProc); if(m_ID==0) { TRACE("定时器设定失败!"); return FALSE; } TRACE("定时器已经设定.\n"); return TRUE; } CALLBACK CMySubNet::TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime) { MessageBeep(-1); } BOOL CMySubNet::IsActive(char *ip) { WSAData wsaData; BOOL bRet; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { return FALSE; } struct hostent* phe; phe=gethostbyname(ip); if(phe==NULL) { return FALSE; } HINSTANCE hIcmp=LoadLibrary("ICMP.dll"); if(hIcmp==0) { return FALSE; } typedef HANDLE (WINAPI* pfnHV)(VOID); typedef BOOL (WINAPI* pfnBH)(HANDLE); typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); pfnHV pIcmpCreateFile; pfnBH pIcmpCloseHandle; pfnDHDPWPipPDD pIcmpSendEcho; pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp, "IcmpCreateFile"); pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, "IcmpCloseHandle"); pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, "IcmpSendEcho"); if(pIcmpCreateFile==NULL) { return FALSE; } if(pIcmpCloseHandle==NULL) { return FALSE; } if(pIcmpSendEcho==NULL) { return FALSE; } HANDLE hIP=pIcmpCreateFile(); if(hIP==INVALID_HANDLE_VALUE) { return FALSE; } char acPingBuffer[64]; memset(acPingBuffer, '\xAA', sizeof(acPingBuffer)); PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer)); if(pIpe==0) { return FALSE; } pIpe->Data = acPingBuffer; pIpe->DataSize = sizeof(acPingBuffer); DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]), acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 1000); if(dwStatus!=0) { bRet=TRUE; } else { bRet=FALSE; } GlobalFree(pIpe); FreeLibrary(hIcmp); WSACleanup(); return bRet; } void CMySubNet::AddActiveHost(CString strActive) { if(strActive.IsEmpty()) return; BOOL bAdd=TRUE; int nCount=m_ActiveHosts.GetSize(); for(int i=0;i IsWindowVisible()) { char buf[10]; int count=m_pList->GetItemCount(); sprintf(buf,"%d",count); int nItem=m_pList->InsertItem(count,buf); m_nListItem=nItem; m_pList->SetItemText(nItem,0,m_Address); m_pList->SetItemText(nItem,1,m_Mask); if(m_nState==0) { m_pList->SetItemText(nItem,2,"正在搜索活动主机......"); } else if(m_nState==1) { m_pList->SetItemText(nItem,2,"活动主机搜索完毕!"); } if(m_nState==0) return; //活动主机数量 char chNumber[10]; itoa(m_nActiveNumber,chNumber,10); m_pList->SetItemText(nItem,3,chNumber); } } void CMySubNet::UpdateList() { if(m_pList!=NULL && m_pList->IsWindowVisible()) { ////////////////////////////////////////////////////////////////////////// for(int i=0;i GetItemCount();i++) { char IP[20]; m_pList->GetItemText(i,0,IP,sizeof(IP)); if(m_Address==IP) break; } m_nListItem=i; ////////////////////////////////////////////////////////////////////////// if(m_nState==0) { m_pList->SetItemText(m_nListItem,2,"正在搜索活动主机......"); } else if(m_nState==1) { m_pList->SetItemText(m_nListItem,2,"活动主机搜索完毕!"); } if(m_nState==0) return; //活动主机数量 char chNumber[10]; itoa(m_nActiveNumber,chNumber,10); m_pList->SetItemText(m_nListItem,3,chNumber); } }