MIB.cpp
上传用户:yfy060102
上传日期:2021-05-22
资源大小:60k
文件大小:7k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. // MIB.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "SNMPApp.h"
  5. #include "snmp.h"
  6. #include "MIB.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. void strPrintf(const char * pstr,int style=0,int color=0);
  13. enum {normal=0,bold=1,italic=2};
  14. enum {black=0,blue=0x00ff0000,green=0x0000ff00,red=0x000000ff};
  15. #define WM_ROUTERFINISH WM_USER+78
  16. CRouter::CRouter()
  17. {
  18. m_psnmp=NULL;
  19. }
  20. CRouter::~CRouter()
  21. {
  22. int i;
  23. for (i=0;i<m_ifTable.m_ifTableEntries.GetSize();i++)
  24. delete m_ifTable.m_ifTableEntries.GetAt(i);
  25. for (i=0;i<m_ipAddrTable.m_ipAddrTableEntries.GetSize();i++)
  26. delete m_ipAddrTable.m_ipAddrTableEntries.GetAt(i);
  27. for (i=0;i<m_ipRouteTable.m_ipRouteTableEntries.GetSize();i++)
  28. delete m_ipRouteTable.m_ipRouteTableEntries.GetAt(i);
  29. }
  30. BOOL CRouter::GetSystem(CSnmp* pSnmp)
  31. {
  32. m_psnmp=pSnmp;
  33. //internet(1.3.6.1).mgmt(2).mib2(1)
  34. m_CurrOid[0]="1.3.6.1.2.1.1.1.0";//system(1).sysDescr(1).0
  35. m_CurrOid[1]="1.3.6.1.2.1.1.2.0";//system(1).sysObjectID(2).0
  36. m_CurrOid[2]="1.3.6.1.2.1.1.5.0";//system(1).sysName(3).0
  37. m_psnmp->CreateVbl(NULL,NULL);
  38. for(int i=0;i<3;i++)
  39. m_psnmp->SetVbl(m_CurrOid[i],NULL);
  40. m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
  41. m_psnmp->Send((LPCTSTR)m_ipAddr);
  42. if (!m_psnmp->WaitForResponse())
  43. {
  44. m_sys.sysName="none";
  45. m_sys.sysDescr="Unkown";
  46. m_sys.sysObjectID=0;
  47. return FALSE;
  48. }
  49. m_psnmp->Receive();
  50. for (i=0;i<3;i++)
  51. {
  52. if(strcmp(m_psnmp->m_strOid[i],m_CurrOid[0])==0)
  53. m_sys.sysDescr=m_psnmp->m_strValue[i];
  54. else if (strcmp(m_psnmp->m_strOid[i],m_CurrOid[1])==0)
  55. m_sys.sysObjectID=atoi(m_psnmp->m_strValue[i]);
  56. else if (strcmp(m_psnmp->m_strOid[i],m_CurrOid[2])==0)
  57. m_sys.sysName=m_psnmp->m_strValue[i];
  58. }
  59. return TRUE;
  60. }
  61. void CRouter::GetifTable(CSnmp* pSnmp)
  62. {
  63. m_psnmp=pSnmp;
  64. ASSERT(m_psnmp->IsCreated());
  65. m_CurrOid[0]="1.3.6.1.2.1.2.1";
  66. m_psnmp->CreateVbl(NULL,NULL);
  67. m_psnmp->SetVbl(m_CurrOid[0],NULL);
  68. m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
  69. m_psnmp->Send((LPCTSTR)m_ipAddr);
  70. if (!m_psnmp->WaitForResponse())
  71. {
  72. AfxMessageBox("Get ifTable failure!");
  73. return;
  74. }
  75. m_psnmp->Receive();
  76. m_ifTable.ifNumber=atoi(m_psnmp->m_strValue[0]);
  77. //internet(1.3.6.1).mgmt(2).mib2(1).interfaces(2)
  78. CString firstStr="1.3.6.1.2.1.2.2.1.1";//ifIndex:index
  79. CString nextStr="1.3.6.1.2.1.2.2.1.1";//ifIndex
  80. do
  81. {
  82. if (!GetTableCol(nextStr,firstStr,pSnmp))
  83. break;
  84. CifTableEntry* pNewEntry=new CifTableEntry();
  85. pNewEntry->ifIndex=atoi(m_psnmp->m_strValue[0]);
  86. m_ifTable.m_ifTableEntries.Add(pNewEntry);;
  87. }while(1);
  88. m_CurrOid[0]="1.3.6.1.2.1.2.2.1.2";//ifDescr
  89. m_CurrOid[1]="1.3.6.1.2.1.2.2.1.3";//ifType
  90. m_CurrOid[2]="1.3.6.1.2.1.2.2.1.6";//ifPhysAddress
  91. char buff[10];
  92. for (int i=0;i<m_ifTable.m_ifTableEntries.GetSize();i++)
  93. {
  94. m_psnmp->CreateVbl(NULL,NULL);
  95. CifTableEntry* pEntry=
  96. (CifTableEntry*)(m_ifTable.m_ifTableEntries.GetAt(i));
  97. itoa(pEntry->ifIndex,buff,10);
  98. m_psnmp->SetVbl(m_CurrOid[0]+'.'+buff,NULL);
  99. m_psnmp->SetVbl(m_CurrOid[1]+'.'+buff,NULL);
  100. m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
  101. m_psnmp->Send((LPCTSTR)m_ipAddr);
  102. m_psnmp->WaitForResponse();
  103. m_psnmp->Receive();
  104. pEntry->ifDescr=m_psnmp->m_strValue[0];
  105. pEntry->ifType=atoi(m_psnmp->m_strValue[1]);
  106. pEntry->ifPhysAddress=atoi(m_psnmp->m_strValue[2]);
  107. }
  108. }
  109. void CRouter::GetipAddrTable(CSnmp* pSnmp)
  110. {
  111. m_psnmp=pSnmp;
  112. //internet(1.3.6.1).mgmt(2).mib2(1).
  113. //ip(4).ipAddrTable(20).ipAddrEntry(1)
  114. CString firstStr="1.3.6.1.2.1.4.20.1.1";//ipAdEntAddr:index
  115. CString nextStr="1.3.6.1.2.1.4.20.1.1";
  116. do
  117. {
  118. if (!GetTableCol(nextStr,firstStr,pSnmp))
  119. break;
  120. CipAddrTableEntry* pNewEntry=new CipAddrTableEntry();
  121. pNewEntry->ipAdEntAddr=m_psnmp->m_strValue[0];
  122. m_ipAddrTable.m_ipAddrTableEntries.Add(pNewEntry);
  123. }while(1);
  124. m_CurrOid[0]="1.3.6.1.2.1.4.20.1.2";//ipAdEntIfIndex
  125. m_CurrOid[1]="1.3.6.1.2.1.4.20.1.3";//ipAdEntNetMask
  126. for (int i=0;i<m_ipAddrTable.m_ipAddrTableEntries.GetSize();i++)
  127. {
  128. m_psnmp->CreateVbl(NULL,NULL);
  129. CipAddrTableEntry* pEntry=
  130. (CipAddrTableEntry*)(m_ipAddrTable.m_ipAddrTableEntries.GetAt(i));
  131. m_psnmp->SetVbl(m_CurrOid[0]+'.'+pEntry->ipAdEntAddr,NULL);
  132. m_psnmp->SetVbl(m_CurrOid[1]+'.'+pEntry->ipAdEntAddr,NULL);
  133. m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
  134. m_psnmp->Send((LPCTSTR)m_ipAddr);
  135. m_psnmp->WaitForResponse();
  136. m_psnmp->Receive();
  137. pEntry->ipAdEntIfIndex=atoi(m_psnmp->m_strValue[0]);
  138. pEntry->ipAdEntNetMask=m_psnmp->m_strValue[1];
  139. }
  140. }
  141. void CRouter::GetipRouteTable(CSnmp* pSnmp)
  142. {
  143. m_psnmp=pSnmp;
  144. ASSERT(m_psnmp->IsCreated());
  145. //internet(1.3.6.1).mgmt(2).mib2(1).
  146. //ip(4).ipRouteTable(21).ipRouteEntry(1)
  147. CString firstStr="1.3.6.1.2.1.4.21.1.1";//ipRouteDest:index
  148. CString nextStr="1.3.6.1.2.1.4.21.1.1";
  149. do
  150. {
  151. if (!GetTableCol(nextStr,firstStr,pSnmp))
  152. break;
  153. CipRouteTableEntry* pNewEntry=new CipRouteTableEntry();
  154. pNewEntry->ipRouteDst=m_psnmp->m_strValue[0];
  155. m_ipRouteTable.m_ipRouteTableEntries.Add(pNewEntry);
  156. }while(1);
  157. m_CurrOid[0]="1.3.6.1.2.1.4.21.1.2";//ipRouteIfIndex
  158. m_CurrOid[1]="1.3.6.1.2.1.4.21.1.7";//ipRouteNextHop
  159. for (int i=0;i<m_ipRouteTable.m_ipRouteTableEntries.GetSize();i++)
  160. {
  161. m_psnmp->CreateVbl(NULL,NULL);
  162. CipRouteTableEntry* pEntry=
  163. (CipRouteTableEntry*)(m_ipRouteTable.m_ipRouteTableEntries.GetAt(i));
  164. m_psnmp->SetVbl(m_CurrOid[0]+'.'+pEntry->ipRouteDst,NULL);
  165. m_psnmp->SetVbl(m_CurrOid[1]+'.'+pEntry->ipRouteDst,NULL);
  166. m_psnmp->CreatePdu(SNMP_PDU_GET,NULL,NULL,NULL);
  167. m_psnmp->Send((LPCTSTR)m_ipAddr);
  168. m_psnmp->WaitForResponse();
  169. m_psnmp->Receive();
  170. pEntry->ipRouteIfIndex=atoi(m_psnmp->m_strValue[0]);
  171. pEntry->ipRouteNextHop=m_psnmp->m_strValue[1];
  172. }
  173. }
  174. BOOL CRouter::GetRouterInfo(CSnmp* pSnmp)
  175. {
  176. ASSERT(pSnmp);
  177. m_psnmp=pSnmp;
  178. if (!GetSystem(pSnmp))
  179. return FALSE;
  180. GetifTable(pSnmp);
  181. GetipAddrTable(pSnmp);
  182. GetipRouteTable(pSnmp);
  183. m_psnmp=NULL;
  184. return TRUE;
  185. }
  186. BOOL CRouter::GetTableCol(CString &nStr, CString &fStr,CSnmp* psnmp)
  187. {
  188. m_psnmp=psnmp;
  189. ASSERT(m_psnmp->IsCreated());
  190. m_psnmp->CreateVbl(NULL,NULL);
  191. m_psnmp->SetVbl(nStr,NULL);
  192. m_psnmp->CreatePdu(SNMP_PDU_GETNEXT,NULL,NULL,NULL);
  193. m_psnmp->Send((LPCTSTR)m_ipAddr);
  194. if (!m_psnmp->WaitForResponse())
  195. return FALSE;
  196. m_psnmp->Receive();
  197. if(m_psnmp->PDU_type!=SNMP_PDU_RESPONSE)
  198. return FALSE;//接收到错误信息
  199. //我认为已经到达表的最后一行,任务完成
  200. if (m_psnmp->error_status==SNMP_ERROR_NOSUCHNAME)
  201. return FALSE;
  202. int len=fStr.GetLength();
  203. CString str=m_psnmp->m_strOid[0].Left(len);
  204. if (fStr.CompareNoCase((LPCTSTR)str)!=0)
  205. return FALSE;
  206. nStr=m_psnmp->m_strOid[0];
  207. return TRUE;
  208. }
  209. void CRouter::PrintRouterInfo()
  210. {
  211. CString temp;
  212. strPrintf("///The information of router:",italic,0x00dd00ff);
  213. strPrintf(m_ipAddr,italic,blue);
  214. strPrintf("////n",italic,0x00dd00ff);
  215. strPrintf("Router name:",bold,blue);
  216. strPrintf(m_sys.sysName);
  217. strPrintf("nRouter ObjectID:",bold,blue);
  218. temp.Format("%dn",m_sys.sysObjectID);
  219. strPrintf(temp);
  220. strPrintf("Router descriptor:",bold,blue);
  221. temp.Format(":n%sn",m_sys.sysDescr);
  222. strPrintf(temp);
  223. strPrintf("Router interface Ips:n   ",bold,blue);
  224. for (int i=0;i<m_ipAddrTable.m_ipAddrTableEntries.GetSize();i++)
  225. {
  226. CipAddrTableEntry* pEntry=
  227. (CipAddrTableEntry*)m_ipAddrTable.m_ipAddrTableEntries.GetAt(i);
  228. strPrintf(pEntry->ipAdEntAddr);
  229. strPrintf("t");
  230. }
  231. strPrintf("n///Router Information end.///nn",italic,0x00dd00ff);
  232. }