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

📄 mysnmpdlg.cpp

📁 动态的发现某个路由器的所有子网的拓扑结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			OnFinish();
			//////////////////////////////////////////////////////////////////////////			
			return;
		}
		//////////////////////////////////////////////////////////////////////////
		m_hVBL=SnmpCreateVbl(m_hSession,NULL,NULL); //创建新的变量绑定列表
		SnmpSetVb(m_hVBL,0,&dName,NULL);
		HSNMP_PDU hPdu=SnmpCreatePdu(m_hSession,SNMP_PDU_GETNEXT,100,0,0,m_hVBL);
		SnmpSendMsg(m_hSession,0,m_hDstEntity,m_hContext,hPdu);
		
	}
}
//将
SNMPAPI_STATUS CMySnmpDlg::ValToStr(smiLPVALUE dValue, smiUINT32 nSize, LPSTR szValue)
{
	smiUINT32 lDays = 0;
	smiUINT32 lHours = 0;
	smiUINT32 lMinutes = 0;
	smiUINT32 lSeconds = 0;
	smiUINT32 lHundreths = 0;
	
	switch(dValue->syntax)
	{
	case SNMP_SYNTAX_INT : //sNumber
		//		printf(" **sNumber** ");
		smiINT sNumber;
		sNumber=dValue->value.sNumber;
		wsprintf(szValue,"%d",sNumber);
		break;
		
	case SNMP_SYNTAX_UINT32 : //uNumber
	case SNMP_SYNTAX_CNTR32 :
	case SNMP_SYNTAX_GAUGE32 :	
		//		printf(" **uNumber** ");
		smiUINT32 uNumber;
		uNumber=dValue->value.uNumber;
		wsprintf(szValue,"%d",uNumber);
		break;
		
	case SNMP_SYNTAX_CNTR64 : //hNumber
		smiCNTR64 hNumber;
		hNumber=dValue->value.hNumber;
		wsprintf(szValue,"%d",hNumber);
		break;
	case SNMP_SYNTAX_TIMETICKS :		
		if(dValue->value.uNumber!=0)
		{
			lHundreths=dValue->value.uNumber % HUNDRED;
			lSeconds=dValue->value.uNumber/HUNDRED;
			if(lSeconds!=0)
			{
				lDays=lSeconds/DAY;
				lSeconds %= DAY;
				if(lSeconds!=0)
				{
					lHours = lSeconds / HOUR;
					lSeconds %= HOUR;
					if(lSeconds!=0)
					{
						lMinutes = lSeconds / MINUTE;
						lSeconds %= MINUTE;
					}
				}
			}
		}
		wsprintf(szValue,"%lu,%lu:%lu:%lu.%lu",
			lDays, lHours, lMinutes, lSeconds, lHundreths);
		break;
		
	case SNMP_SYNTAX_OCTETS : //string
	case SNMP_SYNTAX_OPAQUE :
	case SNMP_SYNTAX_NSAPADDR :
		//		printf(" **string** ");
		smiOCTETS Mystring;
		Mystring=dValue->value.string;
		wsprintf(szValue,"%s",Mystring.ptr);
		break;
	case SNMP_SYNTAX_IPADDR :
		//		printf("**IpAdress**");		
		sprintf(szValue,"%d.%d.%d.%d",
			*(dValue->value.string.ptr),
			*(dValue->value.string.ptr+1),
			*(dValue->value.string.ptr+2),
			*(dValue->value.string.ptr+3));
		break;
	case SNMP_SYNTAX_OID : //oid
		//		printf(" **oid** ");
		smiOID oid;
		oid=dValue->value.oid;
		SnmpOidToStr(&oid,100,szValue);
		break;
		
	case SNMP_SYNTAX_NULL : //empty
	case SNMP_SYNTAX_NOSUCHOBJECT :
	case SNMP_SYNTAX_NOSUCHINSTANCE :
	case SNMP_SYNTAX_ENDOFMIBVIEW :
		//		printf(" **empty** ");
		smiBYTE empty;
		empty=dValue->value.empty;
		wsprintf(szValue,"%s","No Value Returned");
		break;
	default: //other
		//		printf(" **other** ");
		wsprintf(szValue,"%s","Other Type Value");
		break;
	}
	return TRUE;
}
//在这里分析变量名和变量值,提取有用的信息
void CMySnmpDlg::Analyse(char *szName, char *szValue)
{
	CString strValue(szValue);
	if(IsBeginWith(szName,"1.3.6.1.2.1.1")) //获取的是系统信息
	{		
		m_Route.m_SystemInfo.Add(strValue);
	}
	if(IsBeginWith(szName,"1.3.6.1.2.1.4.21.1")) //路由表信息
	{
		CString strName(szName);
		m_Route.m_ipRouteTableName.Add(strName);
		m_Route.m_ipRouteTableValue.Add(strValue);
	}
	if(IsBeginWith(szName,"1.3.6.1.2.1.4.21.1.1")) //获取的是ipRouteDest
	{
		m_Route.m_ipRouteDest.Add(strValue);
	}
	if(IsBeginWith(szName,"1.3.6.1.2.1.4.21.1.8")) //获取的是ipRouteType
	{
		m_Route.m_ipRouteType.Add(strValue);
	}
	if(IsBeginWith(szName,"1.3.6.1.2.1.4.21.1.11")) //获取的是ipRouteMask
	{
		m_Route.m_ipRouteMask.Add(strValue);
	}	
}
//判断某个字符传是否以某个字符串开头
BOOL CMySnmpDlg::IsBeginWith(char *pString, char *pSubString)
{
	if(pString==NULL || pSubString==NULL)
		return FALSE;
	CString strName(pString);
	int nLen=strlen(pSubString);
	if(strName.Left(nLen)==pSubString && strName.GetAt(nLen)=='.')
		return TRUE;
	return FALSE;
}
//获取路由器系统信息
void CMySnmpDlg::OnButtonsysteminfo() 
{
	// TODO: Add your control notification handler code here
	KillTimer(0);
	m_ctrlListCtrl.ShowWindow(SW_SHOW);
	m_Route.ShowSystemInfo(&m_ctrlListCtrl);
	m_nListType=LIST_SYSTEMINFO;
}
//获取路由表信息
void CMySnmpDlg::OnButtonroutetable() 
{
	// TODO: Add your control notification handler code here
	KillTimer(0);
	m_ctrlListCtrl.ShowWindow(SW_SHOW);
	m_Route.ShowRouteTable(&m_ctrlListCtrl);
	m_nListType=LIST_ROUTETABLE;
	
}
//获取路由器子网信息
void CMySnmpDlg::OnButtonsubnetinfo() 
{
	// TODO: Add your control notification handler code here
	KillTimer(0);
	m_ctrlListCtrl.ShowWindow(SW_SHOW);
	m_Route.ShowSubNetInfo(&m_ctrlListCtrl);
	m_nListType=LIST_ROUTESUBNET;
}
//查看拓扑图
void CMySnmpDlg::OnButtontuopu() 
{
	// TODO: Add your control notification handler code here
	//m_Route.ShowTouPu(); //这个函数也可以用
	this->ShowTouPu();
	SetTimer(0,1000,NULL); //启动定时器 以实现定时更新
	m_nListType=LIST_ROUTETUOPU;
}

void CMySnmpDlg::OnButtonquit() 
{
	// TODO: Add your control notification handler code here
	m_Route.StopSearching();
	this->OnCancel();
}

void CMySnmpDlg::OnButtonabout() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg dlg;
	dlg.DoModal();
}
//获取完全部信息后的处理工作
void CMySnmpDlg::OnFinish()
{
	m_messageDlg.ShowWindow(SW_HIDE);
	m_messageDlg.DestroyWindow();

	CButton* pButton;	
	pButton=(CButton*)this->GetDlgItem(IDC_BUTTONSYSTEMINFO);
	pButton->EnableWindow(TRUE);
	
	pButton=(CButton*)this->GetDlgItem(IDC_BUTTONROUTETABLE);
	pButton->EnableWindow(TRUE);
	
	pButton=(CButton*)this->GetDlgItem(IDC_BUTTONSUBNETINFO);
	pButton->EnableWindow(TRUE);
	
	pButton=(CButton*)this->GetDlgItem(IDC_BUTTONTUOPU);
	pButton->EnableWindow(TRUE);
	
	m_Route.ShowSystemInfo(&m_ctrlListCtrl);
	m_Route.SearchActiveHosts();//开始搜索活动主机
}

void CMySnmpDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	m_Route.StopSearching();
	CDialog::OnClose();
}

void CMySnmpDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	if(m_nListType==LIST_ROUTESUBNET)
	{
		POSITION pos=m_ctrlListCtrl.GetFirstSelectedItemPosition();
		int nItem=m_ctrlListCtrl.GetNextSelectedItem(pos);

		if(nItem!=-1) //表示选中有记录 显示该记录所对应的子网的活动主机情况
		{
			char chIP[20];
			m_ctrlListCtrl.GetItemText(nItem,0,chIP,sizeof(chIP));
			CMySubNet* pSub=NULL;
			for(int i=0;i<m_Route.m_SubNets.GetSize();i++)
			{
				pSub=(CMySubNet*)m_Route.m_SubNets.GetAt(i);
				if(pSub->m_Address==chIP)
					break;
			}
			if(pSub!=NULL)
			{
				//////////////////////////////////////////////////////////////////////////
				//在这里绘制该子网的活动主机
				CActiveHostDlg dlg;
				dlg.m_pActiveHosts=&(pSub->m_ActiveHosts);
				pSub->m_pActiveHostDlg=&dlg;
				dlg.DoModal();
				//////////////////////////////////////////////////////////////////////////
			}
		}
	}
	*pResult = 0;
}
#include <math.h>
void CMySnmpDlg::ShowTouPu()
{
	//////////////////////////////////////////////////////////////////////////
	for(int n=0;n<m_TipDataArray.GetSize();n++)
	{
		TipData* p=(TipData*)m_TipDataArray.GetAt(n);
		if(p)
		{
			delete p;
			p=NULL;
		}
	}
	m_TipDataArray.RemoveAll();
	//////////////////////////////////////////////////////////////////////////
	
	CRect rect;
	m_ctrlListCtrl.GetClientRect(&rect);
	rect.left+=155;
	rect.right+=155;
	rect.top+=30;
	rect.bottom+=30;
	m_RightRect=rect;
//	ClientToScreen(&rect);
	m_ctrlListCtrl.ShowWindow(SW_HIDE);
	CDC* pdc=GetDC();
	pdc->SetBkMode(TRANSPARENT);//设置透明模式
	double pi=3.1415926535;
	pdc->Rectangle(&rect);
	//////////////////////////////////////////////////////////////////////////
	//绘制提示信息
	CPoint p;
	p.x=rect.left+30;
	p.y=rect.top+20;
	DrawHost(pdc,p,RGB(255,0,0));
	pdc->TextOut(p.x+15,p.y-8,"路由器");
	p.x=p.x+200;
	DrawHost(pdc,p,RGB(0,255,0));
	pdc->TextOut(p.x+15,p.y-8,"子网");
	p.x=p.x+200;
	DrawHost(pdc,p,RGB(0,0,255));
	pdc->TextOut(p.x+15,p.y-10,"活动主机");
	//////////////////////////////////////////////////////////////////////////
	CPoint CenterPoint;
	CenterPoint=rect.CenterPoint();
	//路由器的绘制
	DrawHost(pdc,CenterPoint,RGB(255,0,0));
	pdc->TextOut(CenterPoint.x-30,CenterPoint.y+8,m_IPAddress);
	
	TipData* pdata=new TipData;
	pdata->point=CenterPoint;
	pdata->strIP=m_IPAddress;
	m_TipDataArray.Add(pdata);
	
	//各个子网的绘制
	int nSubNetCount=m_Route.m_SubNets.GetSize();
	for(int i=0;i<nSubNetCount;i++)
	{
		CPoint point;
		point.x=150*cos(2*pi/nSubNetCount*i)+CenterPoint.x;
		point.y=150*sin(2*pi/nSubNetCount*i)+CenterPoint.y;
		DrawHost(pdc,point,RGB(0,255,0));
		CPen pen,*poldPen;
		pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
		poldPen=pdc->SelectObject(&pen);
		pdc->MoveTo(CenterPoint.x,CenterPoint.y);
		pdc->LineTo(point.x,point.y);
		pdc->SelectObject(poldPen);
		
		CMySubNet* pSubNet=(CMySubNet*)m_Route.m_SubNets.GetAt(i);
		pdc->TextOut(point.x-30,point.y+8,pSubNet->m_Address);

		TipData* pD=new TipData;
		pD->point=point;
		pD->strIP=pSubNet->m_Address;
		m_TipDataArray.Add(pD);
		
		//各个活动主机的绘制
		int nHostCount=pSubNet->m_ActiveHosts.GetSize();
		for(int nHost=0;nHost<nHostCount;nHost++)
		{
			CPoint temp;
			temp.x=60*cos(2*pi/nHostCount*nHost)+point.x;
			temp.y=60*sin(2*pi/nHostCount*nHost)+point.y;
			DrawHost(pdc,temp,RGB(0,0,255));
			pdc->TextOut(temp.x-10,temp.y+8,pSubNet->m_ActiveHosts.GetAt(nHost));
			pdc->MoveTo(point);
			pdc->LineTo(temp);

			TipData* pTemp=new TipData;
			pTemp->point=temp;
			pTemp->strIP=pSubNet->m_ActiveHosts.GetAt(nHost);
			m_TipDataArray.Add(pTemp);
		}
	}	
}
//绘制host
void CMySnmpDlg::DrawHost(CDC *pdc, CPoint point, COLORREF crColor)
{
	CBrush brush,*pold;
	brush.CreateSolidBrush(crColor);
	pold=pdc->SelectObject(&brush);
	if(crColor==RGB(0,0,255))
		pdc->Rectangle(point.x-6,point.y-6,point.x+6,point.y+6);
	else
		pdc->Rectangle(point.x-10,point.y-10,point.x+10,point.y+10);
	pdc->SelectObject(pold);
}

//单击鼠标消息相应函数
void CMySnmpDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_RightRect.PtInRect(point))
	{
		for(int i=0;i<m_TipDataArray.GetSize();i++)
		{
			TipData* pData=(TipData*)m_TipDataArray.GetAt(i);
			CPoint temp=pData->point;
			CRect rect(temp.x-10,temp.y-10,temp.x+10,temp.y+10);
			if(rect.PtInRect(point))
			{
				CString str;
				str.Format("选中的IP是:%s",pData->strIP);
				SetWindowText(str);

//				if(m_pTipDlg!=NULL)
//				{
//					delete m_pTipDlg;
//					m_pTipDlg=NULL;
//				}
//				m_pTipDlg=new CTipDlg;
//				m_pTipDlg->Create(IDD_DIALOG2);
//				m_pTipDlg->m_strIpAddress=pData->strIP;
//			//	m_pTipDlg->ShowWindow(SW_SHOW);
//				m_pTipDlg->SetWindowPos(this,point.x,point.y,100,100,SWP_SHOWWINDOW);
				break;
			}
			else
			{
				SetWindowText("MySnmp");
//				if(m_pTipDlg!=NULL)
//				{
//					if(m_pTipDlg->IsWindowVisible())
//						m_pTipDlg->ShowWindow(SW_HIDE);
//					delete m_pTipDlg;
//					m_pTipDlg=NULL;
//				}
			}
		}
	}
//	SendMessage(WM_PAINT);
	CDialog::OnLButtonDown(nFlags, point);
}

void CMySnmpDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_nListType!=LIST_ROUTETUOPU)
		KillTimer(0);
	this->ShowTouPu();
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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