📄 myroute.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 + -