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;iGetMaxNumber(); //获取该子网的可能最大主机数 
	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;iIsWindowVisible()) 
	{ 
		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;iGetItemCount();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); 
	} 
}