⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myroute.cpp

📁 动态的发现某个路由器的所有子网的拓扑结构
💻 CPP
字号:
// MyRoute.cpp: implementation of the CMyRoute class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MySnmp.h"
#include "MyRoute.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
char SystemName[][20]={"sysDescr","sysObjectID","sysUpTime","sysContact","sysName","sysLocation","sysServices"};
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyRoute::CMyRoute()
{
	m_pDlg=NULL;
	m_SystemInfo.RemoveAll();
	m_ipRouteDest.RemoveAll();
	m_ipRouteType.RemoveAll();
	m_ipRouteMask.RemoveAll();
	m_ipRouteTableName.RemoveAll();
	m_ipRouteTableValue.RemoveAll();
}

CMyRoute::~CMyRoute()
{
	int nCount=m_SubNets.GetSize();
	for(int i=0;i<nCount;i++)
	{
		CMySubNet* pSub=(CMySubNet*)m_SubNets.GetAt(i);
		if(pSub!=NULL)
		{
			delete pSub;
		}
	}
}

void CMyRoute::ShowSystemInfo(CListCtrl *pList)
{
	if(pList==NULL)
		return;
	int nCount=m_SystemInfo.GetSize();
	if(nCount<=0)
	{
		AfxMessageBox("没有系统信息可以显示!");
		return;
	}
	pList->DeleteAllItems(); //删除所有元素
	int nColumnCount=pList->GetHeaderCtrl()->GetItemCount();
	for(int i=0;i<nColumnCount;i++)
		pList->DeleteColumn(0); //删除所有列
	pList->SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	pList->InsertColumn(0,"系统变量名",LVCFMT_LEFT,150);
	pList->InsertColumn(1,"系统变量值",LVCFMT_LEFT,400);
	for(i=0;i<=6;i++)
	{
		char buf[5];
		sprintf(buf,"%d",i);
		int nItem=pList->InsertItem(i,buf);
		pList->SetItemText(nItem,0,SystemName[i]);
		pList->SetItemText(nItem,1,m_SystemInfo.GetAt(i));
	}

}

void CMyRoute::ShowSubNetInfo(CListCtrl *pList)
{
	if(pList==NULL)
		return;
	pList->DeleteAllItems(); //删除所有元素
	int nColumnCount=pList->GetHeaderCtrl()->GetItemCount();
	for(int i=0;i<nColumnCount;i++)
		pList->DeleteColumn(0); //删除所有列
	pList->SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	pList->InsertColumn(0,"子网地址",LVCFMT_LEFT,150);
	pList->InsertColumn(1,"子网掩码",LVCFMT_LEFT,150);
	pList->InsertColumn(2,"状态",LVCFMT_LEFT,150);
	pList->InsertColumn(3,"活动主机数量",LVCFMT_LEFT,100);
	//////////////////////////////////////////////////////////////////////////
	//显示所有子网
	if(m_SubNets.GetSize()<=0)
	{
		GetSubNets(); //获取子网
	}
	for(i=0;i<m_SubNets.GetSize();i++)
	{		
		CMySubNet* psubNet=(CMySubNet*)m_SubNets.GetAt(i);
		psubNet->ShowSubNetInfo(pList);
/*
		char buf[5];
		sprintf(buf,"%d",i);
		int nItem=pList->InsertItem(i,buf);
		//子网地址
		pList->SetItemText(nItem,0,psubNet->m_Address);
		//子网掩码
		pList->SetItemText(nItem,1,psubNet->m_Mask);
		//当前状态
		if(psubNet->m_nState==0)
			pList->SetItemText(nItem,2,"正在搜索活动主机...");
		else if(psubNet->m_nState==1)
			pList->SetItemText(nItem,2,"活动主机搜索完毕!");
		//活动主机数量
		char chNumber[10];
		itoa(psubNet->m_nActiveNumber,chNumber,10);
		pList->SetItemText(nItem,3,chNumber);
		*/
	}
}
//显示路由表
void CMyRoute::ShowRouteTable(CListCtrl *pList)
{
	if(pList==NULL)
		return;
	int nCount=m_ipRouteTableName.GetSize();
	if(nCount<=0)
	{
		AfxMessageBox("没有路由表信息可以显示!");
		return;
	}
	pList->DeleteAllItems(); //删除所有元素
	int nColumnCount=pList->GetHeaderCtrl()->GetItemCount();
	for(int i=0;i<nColumnCount;i++)
		pList->DeleteColumn(0); //删除所有列
	pList->SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	pList->InsertColumn(0,"路由表变量名",LVCFMT_LEFT,350);
	pList->InsertColumn(1,"路由表变量值",LVCFMT_LEFT,150);
	for(i=0;i<nCount;i++)
	{
		char buf[5];
		sprintf(buf,"%d",i);
		int nItem=pList->InsertItem(i,buf);
		pList->SetItemText(nItem,0,m_ipRouteTableName.GetAt(i));
		pList->SetItemText(nItem,1,m_ipRouteTableValue.GetAt(i));
	}
}
//获取所有子网地址,并保存为子网对象
void CMyRoute::GetSubNets()
{
	int nCount=m_ipRouteDest.GetSize();
	for(int i=0;i<nCount;i++)
	{
		int nType;
		nType=atoi(m_ipRouteType.GetAt(i).GetBuffer(1));
		if(nType==3) //直接相连
		{
			CString strIP=m_ipRouteDest.GetAt(i);//获取ip地址
			CString strMask=m_ipRouteMask.GetAt(i);//获取子网掩码
			CString strSubNetNumber;
			int n1,n2,n3,n4;
			ChangeIPToInts(strMask,n1,n2,n3,n4);
			if(IsNomalIP(strIP) && !(n1==255 && n2==255 && n3==255 && n4==255)) //判断是否非特殊IP
			{
				GetSubNetNumber(strIP,strMask,strSubNetNumber);//根据ip地址和子网掩码求子网号码
				CMySubNet *pSubNet=new CMySubNet;
				if(pSubNet==NULL)
				{
					AfxMessageBox("申请空间失败!");
					continue;
				}
				pSubNet->m_Address=strSubNetNumber;
				pSubNet->m_Mask=strMask;
				m_SubNets.Add(pSubNet);
			}
		}
	}
	//////////////////////////////////////////////////////////////////////////
//	CMySubNet* pTest=new CMySubNet;
//	pTest->m_Address="192.168.0.0";
//	pTest->m_Mask="255.255.255.0";
//	m_SubNets.Add(pTest);
//	CMySubNet* pTest2=new CMySubNet;
//	pTest2->m_Address="202.117.98.5";
//	pTest2->m_Mask="255.255.255.0";
//	m_SubNets.Add(pTest2);
//	CMySubNet* pTest3=new CMySubNet;
//	pTest3->m_Address="202.117.96.0";
//	pTest3->m_Mask="255.255.255.0";
//	m_SubNets.Add(pTest3);
//	CMySubNet* pTest4=new CMySubNet;
//	pTest4->m_Address="127.0.0.121";
//	pTest4->m_Mask="255.0.0.0";
//	m_SubNets.Add(pTest4);
	//////////////////////////////////////////////////////////////////////////
	
}
/*
A:0-127
B:128-191
C:192-223
D:224-239
E:240-255
*/
BOOL CMyRoute::IsNomalIP(CString strIP)
{
	int n1,n2,n3,n4;
	ChangeIPToInts(strIP,n1,n2,n3,n4);
	if(n1==0 && n2==0 && n3==0 && n4==0) //代表本机
		return FALSE;
	if(n1==255 && n2==255 && n3==255 && n4==255)//广播地址
		return FALSE;
	if(n1==127)
		return FALSE;
	if(n1>=0 && n1<=127) //A
	{
		if(n2==255 && n3==255 && n4==255) //主机全1 广播地址
			return FALSE;
	}
	else if(n1>=128 && n1<=191) //B
	{
		if(n3==255 && n4==255)
			return FALSE;
	}
	else if(n1>=192 && n1<=223) //C
	{
		if(n4==255)
			return FALSE;
	}
	else if(n1>=224 && n1<=239)//D
		return FALSE;
	else if(n1>=240 && n1<=254) //E
		return FALSE;
	return TRUE;
}
//将字符串的ip地址转换成四个整数形式
void CMyRoute::ChangeIPToInts(CString strIP, int &nField1, int &nField2, int &nField3, int &nField4)
{
	int nPos1,nPos2,nPos3;
	int i;
	char temp[5];
	nPos1=strIP.Find('.',0);
	for(i=0;i<nPos1;i++)
	{
		temp[i]=strIP[i];
	}
	temp[i]='\0';
	nField1=atoi(temp);
	
	nPos2=strIP.Find('.',nPos1+1);
	for(i=nPos1+1;i<nPos2;i++)
	{
		temp[i-nPos1-1]=strIP[i];
	}
	temp[i-nPos1-1]='\0';
	nField2=atoi(temp);
	
	nPos3=strIP.Find('.',nPos2+1);
	for(i=nPos2+1;i<nPos3;i++)
	{
		temp[i-nPos2-1]=strIP[i];
	}
	temp[i-nPos2-1]='\0';
	nField3=atoi(temp);
	
	for(i=nPos3+1;i<strIP.GetLength();i++)
	{
		temp[i-nPos3-1]=strIP[i];
	}
	temp[i-nPos3-1]='\0';
	nField4=atoi(temp);
	
}
//根据ip地址和子网掩码求子网号码
void CMyRoute::GetSubNetNumber(CString strIP, CString strMask, CString &strSubNetNumber)
{
	int nIP1,nIP2,nIP3,nIP4;
	int nMask1,nMask2,nMask3,nMask4;
	ChangeIPToInts(strIP,nIP1,nIP2,nIP3,nIP4);
	ChangeIPToInts(strMask,nMask1,nMask2,nMask3,nMask4);

	int nResult1,nResult2,nResult3,nResult4;
	nResult1=nIP1 & nMask1;
	nResult2=nIP2 & nMask2;
	nResult3=nIP3 & nMask3;
	nResult4=nIP4 & nMask4;
	strSubNetNumber.Format("%d.%d.%d.%d",nResult1,nResult2,nResult3,nResult4);
}
//开始搜索活动主机
void CMyRoute::SearchActiveHosts()
{
	if(m_SubNets.GetSize()<=0)
		GetSubNets();
	int nCount=m_SubNets.GetSize();
	for(int i=0;i<nCount;i++)
	{
		CMySubNet* pSub=(CMySubNet*)m_SubNets.GetAt(i);
		pSub->SearchActiveHosts();
	}	
}

void CMyRoute::StopSearching()
{
	int nCount=m_SubNets.GetSize();
	for(int i=0;i<nCount;i++)
	{
		CMySubNet* pSub=(CMySubNet*)m_SubNets.GetAt(i);
		pSub->StopSearing();
	}
}

void CMyRoute::ShowTouPu()
{
	//////////////////////////////////////////////////////////////////////////
	//在这里绘制整个路由器极其子网的拓扑图	
	if(m_pDlg!=NULL)
	{
		delete m_pDlg;
		m_pDlg=NULL;
	}
	m_pDlg=new CShowTuoPuDlg;
	if(m_pDlg==NULL)
		return;
	m_pDlg->Create(IDD_DIALOGTUOPU);
	m_pDlg->m_strRouteAddress=m_strAddress;
	m_pDlg->m_pSubNets=&m_SubNets;
	m_pDlg->CenterWindow();
	m_pDlg->ShowWindow(SW_SHOW);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -