www.pudn.com > SNMPApp.rar > DoFindTopology.cpp


#include "stdafx.h" 
#include "MIB.h" 
#include "winsock2.h" 
#include "SNMPAppDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define WM_ROUTERFINISH WM_USER+777 
#define WM_PRINTSTR WM_USER+778 
 
CObArray routerSet;  //CRouter 
CString infprint; 
int level; 
CSNMPAppDlg* pMainWnd=NULL; 
CEvent eStop; 
 
void RecalRouter(CString& strIp,CSnmp* psnmp); 
void printfToStr(CString& strInf); 
void strPrintf(const char * pstr,int style=0,int color=0); 
BOOL IsIpInRouterSet(CString& strIp); 
 
enum {normal=0,bold=1,italic=2}; 
enum {black=0,blue=0x00ff0000,green=0x0000ff00,red=0x000000ff}; 
 
UINT DoFindTopology(LPVOID pParam) 
{ 
	CString strTemp; 
 
	//Initial snmp for GET operation 
	CSnmp snmp; 
	if (!snmp.CreateSession()) 
		return 1; 
 
	pMainWnd=(CSNMPAppDlg*)pParam; 
	CString ip=pMainWnd->m_input; 
 
	snmp.m_community=pMainWnd->m_community; 
 
	level=atoi(pMainWnd->m_num); 
	if (level<0) 
	{ 
		strPrintf("Level value error!\n",italic,black); 
		return 1; 
	} 
 
	strPrintf("Starting topology finding!\n",italic,black); 
	RecalRouter(ip,&snmp); 
	strPrintf("Find Router End,OK!\n",italic,red); 
 
	pMainWnd->SendMessage(WM_ROUTERFINISH, 0, 0); 
 
//	snmp.Close(); 
//	snmp.Cleanup(); 
	return 0; 
} 
 
void RecalRouter(CString& strIp,CSnmp* psnmp) 
{ 
	CString strTemp; 
 
	if (level>3) 
	{ 
		level--; 
		return;	 
	} 
 
	if ( strIp.CollateNoCase("0.0.0.0")==0 || 
		strIp.CollateNoCase("127.0.0.1")==0 ) 
	{ 
		level--; 
		return; 
	} 
 
	if (IsIpInRouterSet(strIp)) 
	{ 
		level--; 
		return;	 
	} 
 
	strTemp.Format("Trying an Ip address:%s ...\n",strIp); 
	strPrintf(strTemp,italic,black); 
	CRouter* pRt=new CRouter(); 
	pRt->m_ipAddr=strIp; 
	if (!pRt->GetRouterInfo(psnmp)) 
	{ 
		strPrintf("Router unkown.\n",italic,red); 
		delete pRt; 
		level--; 
		return; 
	} 
 
	routerSet.Add(pRt); 
	strTemp.Format("Find a Router:%s!\n",pRt->m_ipAddr); 
	strPrintf(strTemp,italic,red); 
	pRt->PrintRouterInfo(); 
	level++; 
 
	for (int j=0;jm_ipRouteTable.m_ipRouteTableEntries.GetSize();j++) 
	{ 
		CipRouteTableEntry* pEntry= 
			(CipRouteTableEntry*)(pRt->m_ipRouteTable.m_ipRouteTableEntries.GetAt(j)); 
		RecalRouter(pEntry->ipRouteNextHop,psnmp); 
	} 
} 
 
void strPrintf(const char * pstr,int style,int color) 
{ 
	infprint=pstr; 
	ASSERT(pMainWnd); 
	pMainWnd->SendMessage(WM_PRINTSTR,style,color); 
	return ; 
} 
 
BOOL IsIpInRouterSet(CString& strIp) 
{ 
	for (int i=0;im_ipAddrTable.m_ipAddrTableEntries.GetSize();j++) 
		{ 
			CipAddrTableEntry* pEntry= 
				(CipAddrTableEntry*)pRouter->m_ipAddrTable.m_ipAddrTableEntries.GetAt(j); 
			if (pEntry->ipAdEntAddr.CompareNoCase(strIp)==0) 
				return TRUE; 
		} 
	} 
 
	return FALSE; 
}