www.pudn.com > SNMPApp.rar > MIB.cpp
// MIB.cpp : implementation file
//
#include "stdafx.h"
#include "SNMPApp.h"
#include "snmp.h"
#include "MIB.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void strPrintf(const char * pstr,int style=0,int color=0);
enum {normal=0,bold=1,italic=2};
enum {black=0,blue=0x00ff0000,green=0x0000ff00,red=0x000000ff};
#define WM_ROUTERFINISH WM_USER+78
CRouter::CRouter()
{
m_psnmp=NULL;
}
CRouter::~CRouter()
{
int i;
for (i=0;iCreateVbl(NULL,NULL);
for(int i=0;i<3;i++)
m_psnmp->SetVbl(m_CurrOid[i],NULL);
m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
m_psnmp->Send((LPCTSTR)m_ipAddr);
if (!m_psnmp->WaitForResponse())
{
m_sys.sysName="none";
m_sys.sysDescr="Unkown";
m_sys.sysObjectID=0;
return FALSE;
}
m_psnmp->Receive();
for (i=0;i<3;i++)
{
if(strcmp(m_psnmp->m_strOid[i],m_CurrOid[0])==0)
m_sys.sysDescr=m_psnmp->m_strValue[i];
else if (strcmp(m_psnmp->m_strOid[i],m_CurrOid[1])==0)
m_sys.sysObjectID=atoi(m_psnmp->m_strValue[i]);
else if (strcmp(m_psnmp->m_strOid[i],m_CurrOid[2])==0)
m_sys.sysName=m_psnmp->m_strValue[i];
}
return TRUE;
}
void CRouter::GetifTable(CSnmp* pSnmp)
{
m_psnmp=pSnmp;
ASSERT(m_psnmp->IsCreated());
m_CurrOid[0]="1.3.6.1.2.1.2.1";
m_psnmp->CreateVbl(NULL,NULL);
m_psnmp->SetVbl(m_CurrOid[0],NULL);
m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
m_psnmp->Send((LPCTSTR)m_ipAddr);
if (!m_psnmp->WaitForResponse())
{
AfxMessageBox("Get ifTable failure!");
return;
}
m_psnmp->Receive();
m_ifTable.ifNumber=atoi(m_psnmp->m_strValue[0]);
//internet(1.3.6.1).mgmt(2).mib2(1).interfaces(2)
CString firstStr="1.3.6.1.2.1.2.2.1.1";//ifIndex:index
CString nextStr="1.3.6.1.2.1.2.2.1.1";//ifIndex
do
{
if (!GetTableCol(nextStr,firstStr,pSnmp))
break;
CifTableEntry* pNewEntry=new CifTableEntry();
pNewEntry->ifIndex=atoi(m_psnmp->m_strValue[0]);
m_ifTable.m_ifTableEntries.Add(pNewEntry);;
}while(1);
m_CurrOid[0]="1.3.6.1.2.1.2.2.1.2";//ifDescr
m_CurrOid[1]="1.3.6.1.2.1.2.2.1.3";//ifType
m_CurrOid[2]="1.3.6.1.2.1.2.2.1.6";//ifPhysAddress
char buff[10];
for (int i=0;iCreateVbl(NULL,NULL);
CifTableEntry* pEntry=
(CifTableEntry*)(m_ifTable.m_ifTableEntries.GetAt(i));
itoa(pEntry->ifIndex,buff,10);
m_psnmp->SetVbl(m_CurrOid[0]+'.'+buff,NULL);
m_psnmp->SetVbl(m_CurrOid[1]+'.'+buff,NULL);
m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
m_psnmp->Send((LPCTSTR)m_ipAddr);
m_psnmp->WaitForResponse();
m_psnmp->Receive();
pEntry->ifDescr=m_psnmp->m_strValue[0];
pEntry->ifType=atoi(m_psnmp->m_strValue[1]);
pEntry->ifPhysAddress=atoi(m_psnmp->m_strValue[2]);
}
}
void CRouter::GetipAddrTable(CSnmp* pSnmp)
{
m_psnmp=pSnmp;
//internet(1.3.6.1).mgmt(2).mib2(1).
//ip(4).ipAddrTable(20).ipAddrEntry(1)
CString firstStr="1.3.6.1.2.1.4.20.1.1";//ipAdEntAddr:index
CString nextStr="1.3.6.1.2.1.4.20.1.1";
do
{
if (!GetTableCol(nextStr,firstStr,pSnmp))
break;
CipAddrTableEntry* pNewEntry=new CipAddrTableEntry();
pNewEntry->ipAdEntAddr=m_psnmp->m_strValue[0];
m_ipAddrTable.m_ipAddrTableEntries.Add(pNewEntry);
}while(1);
m_CurrOid[0]="1.3.6.1.2.1.4.20.1.2";//ipAdEntIfIndex
m_CurrOid[1]="1.3.6.1.2.1.4.20.1.3";//ipAdEntNetMask
for (int i=0;iCreateVbl(NULL,NULL);
CipAddrTableEntry* pEntry=
(CipAddrTableEntry*)(m_ipAddrTable.m_ipAddrTableEntries.GetAt(i));
m_psnmp->SetVbl(m_CurrOid[0]+'.'+pEntry->ipAdEntAddr,NULL);
m_psnmp->SetVbl(m_CurrOid[1]+'.'+pEntry->ipAdEntAddr,NULL);
m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
m_psnmp->Send((LPCTSTR)m_ipAddr);
m_psnmp->WaitForResponse();
m_psnmp->Receive();
pEntry->ipAdEntIfIndex=atoi(m_psnmp->m_strValue[0]);
pEntry->ipAdEntNetMask=m_psnmp->m_strValue[1];
}
}
void CRouter::GetipRouteTable(CSnmp* pSnmp)
{
m_psnmp=pSnmp;
ASSERT(m_psnmp->IsCreated());
//internet(1.3.6.1).mgmt(2).mib2(1).
//ip(4).ipRouteTable(21).ipRouteEntry(1)
CString firstStr="1.3.6.1.2.1.4.21.1.1";//ipRouteDest:index
CString nextStr="1.3.6.1.2.1.4.21.1.1";
do
{
if (!GetTableCol(nextStr,firstStr,pSnmp))
break;
CipRouteTableEntry* pNewEntry=new CipRouteTableEntry();
pNewEntry->ipRouteDst=m_psnmp->m_strValue[0];
m_ipRouteTable.m_ipRouteTableEntries.Add(pNewEntry);
}while(1);
m_CurrOid[0]="1.3.6.1.2.1.4.21.1.2";//ipRouteIfIndex
m_CurrOid[1]="1.3.6.1.2.1.4.21.1.7";//ipRouteNextHop
for (int i=0;iCreateVbl(NULL,NULL);
CipRouteTableEntry* pEntry=
(CipRouteTableEntry*)(m_ipRouteTable.m_ipRouteTableEntries.GetAt(i));
m_psnmp->SetVbl(m_CurrOid[0]+'.'+pEntry->ipRouteDst,NULL);
m_psnmp->SetVbl(m_CurrOid[1]+'.'+pEntry->ipRouteDst,NULL);
m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
m_psnmp->Send((LPCTSTR)m_ipAddr);
m_psnmp->WaitForResponse();
m_psnmp->Receive();
pEntry->ipRouteIfIndex=atoi(m_psnmp->m_strValue[0]);
pEntry->ipRouteNextHop=m_psnmp->m_strValue[1];
}
}
BOOL CRouter::GetRouterInfo(CSnmp* pSnmp)
{
ASSERT(pSnmp);
m_psnmp=pSnmp;
if (!GetSystem(pSnmp))
return FALSE;
GetifTable(pSnmp);
GetipAddrTable(pSnmp);
GetipRouteTable(pSnmp);
m_psnmp=NULL;
return TRUE;
}
BOOL CRouter::GetTableCol(CString &nStr, CString &fStr,CSnmp* psnmp)
{
m_psnmp=psnmp;
ASSERT(m_psnmp->IsCreated());
m_psnmp->CreateVbl(NULL,NULL);
m_psnmp->SetVbl(nStr,NULL);
m_psnmp->CreatePdu(SNMP_PDU_GETNEXT,NULL,NULL,NULL);
m_psnmp->Send((LPCTSTR)m_ipAddr);
if (!m_psnmp->WaitForResponse())
return FALSE;
m_psnmp->Receive();
if(m_psnmp->PDU_type!=SNMP_PDU_RESPONSE)
return FALSE;//接收到错误信息
//我认为已经到达表的最后一行,任务完成
if (m_psnmp->error_status==SNMP_ERROR_NOSUCHNAME)
return FALSE;
int len=fStr.GetLength();
CString str=m_psnmp->m_strOid[0].Left(len);
if (fStr.CompareNoCase((LPCTSTR)str)!=0)
return FALSE;
nStr=m_psnmp->m_strOid[0];
return TRUE;
}
void CRouter::PrintRouterInfo()
{
CString temp;
strPrintf("///The information of router:",italic,0x00dd00ff);
strPrintf(m_ipAddr,italic,blue);
strPrintf("////\n",italic,0x00dd00ff);
strPrintf("Router name:",bold,blue);
strPrintf(m_sys.sysName);
strPrintf("\nRouter ObjectID:",bold,blue);
temp.Format("%d\n",m_sys.sysObjectID);
strPrintf(temp);
strPrintf("Router descriptor:",bold,blue);
temp.Format(":\n%s\n",m_sys.sysDescr);
strPrintf(temp);
strPrintf("Router interface Ips:\n ",bold,blue);
for (int i=0;iipAdEntAddr);
strPrintf("\t");
}
strPrintf("\n///Router Information end.///\n\n",italic,0x00dd00ff);
}