📄 mysnmpdlg.cpp
字号:
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 + -