SNMP1.cpp
上传用户:lvjun8202
上传日期:2013-04-30
资源大小:797k
文件大小:8k
源码类别:

SNMP编程

开发平台:

C/C++

  1. // SNMP1.cpp: implementation of the CSNMP1 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "oam.h"
  6. #include "SNMP1.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CSNMP1::CSNMP1()
  16. {
  17. nMajorVersion=new unsigned long;
  18. nMinorVersion=new unsigned long;
  19. nLevel=new unsigned long;
  20. nTranslateMode=new unsigned long;
  21. nRetransmitMode=new unsigned long;
  22. /* Init MIB var_table , the following tasks should be done:
  23. 1. Design the table structure
  24. 2. Design the table managment service routines
  25. 3. design the data access support routines for each mib var.
  26. In this table, the operations for each specific var 
  27. should be defined, and their function pointers should be stored here 
  28. */
  29.   if(SnmpStartup(nMajorVersion,nMinorVersion,nLevel,nTranslateMode,
  30. nRetransmitMode)!=SNMPAPI_SUCCESS) /*初始化*/
  31. {
  32. //dwErr=SnmpGetLastError(NULL);
  33. switch (SnmpGetLastError(NULL))
  34. {
  35. case SNMPAPI_NOT_INITIALIZED :
  36. AfxMessageBox("The SnmpStartup function did not complete successfully.");
  37. break;
  38. case SNMPAPI_ALLOC_ERROR:
  39. AfxMessageBox("An error occurred during memory allocation.");
  40. break;
  41. case SNMPAPI_OTHER_ERROR :
  42. AfxMessageBox("An unknown or undefined error occurred. ");
  43. break;
  44. default:
  45. break;
  46. }
  47. AfxMessageBox("initilization failure");
  48. }
  49. if(SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V1)!=SNMPAPI_SUCCESS)
  50. //if(SnmpSetTranslateMode(SNMPAPI_TRANSLATED)!=SNMPAPI_SUCCESS) 
  51. AfxMessageBox("SetTranslateMode failure");
  52. if(SnmpSetRetransmitMode(SNMPAPI_ON)!=SNMPAPI_SUCCESS)/*设置重传机制*/
  53. AfxMessageBox("SetRetransmitMode failure");
  54. sessionID=FALSE; 
  55. }
  56. CSNMP1::~CSNMP1()
  57. {
  58. if(nRetransmitMode!=NULL)
  59. delete nRetransmitMode;
  60. if(nTranslateMode!=NULL)
  61. delete nTranslateMode;
  62. if(nLevel!=NULL)
  63. delete nLevel;
  64. if(nMinorVersion!=NULL)
  65. delete nMinorVersion;
  66. if(nMajorVersion!=NULL)
  67. delete nMajorVersion;
  68. if(session!=NULL)
  69. SnmpClose(session);
  70. SnmpCleanup();
  71. }
  72. CSNMP1::CreateSession(HWND hWnd,UINT wMsg)
  73. {
  74. if((session=SnmpCreateSession(hWnd,wMsg,NULL,NULL))==SNMPAPI_FAILURE)
  75. AfxMessageBox("CreateSession failure");
  76. }
  77. //ADD BY qIBING
  78. CSNMP1::CreateSession_Trap(HWND hWnd,UINT wMsg)
  79. {
  80. if((session_trap=SnmpCreateSession(hWnd,wMsg,NULL,NULL))==SNMPAPI_FAILURE)
  81. AfxMessageBox("CreateSession trap failure");
  82. }
  83. CSNMP1::CreateVbl(LPCSTR name,smiLPVALUE pvalue)
  84. {
  85. smiLPOID pOid=new smiOID;
  86. if(SnmpStrToOid(name,pOid)==SNMPAPI_FAILURE)
  87. {AfxMessageBox("CreateVbl failure");
  88. //dwErr=SnmpGetLastError(session);
  89. }
  90. m_hvbl=SnmpCreateVbl(session,pOid,pvalue);
  91. if(m_hvbl==SNMPAPI_FAILURE)
  92. {AfxMessageBox("CreateVbl failure");
  93. //dwErr=SnmpGetLastError(session);
  94. }
  95. if(pOid!=NULL)
  96. delete pOid;
  97.     
  98. }
  99. CSNMP1::SetVbl(LPCSTR name,smiLPVALUE pvalue)
  100. {
  101. smiLPOID pOid=new smiOID;
  102. //if(SnmpStrToOid(name,pOid)==SNMPAPI_FAILURE)
  103.     /******************qibing*/
  104. // SnmpMgrStrToOid(name,pOid);
  105. /*********************qibing*/
  106. if(SnmpStrToOid(name,pOid)==SNMPAPI_FAILURE)
  107. {AfxMessageBox("SetVbl failure--oid");
  108. /* { //dwErr=SnmpGetLastError(session);
  109. switch( dwErr)
  110. {
  111. case SNMPAPI_NOT_INITIALIZED:
  112. AfxMessageBox(" The SnmpStartup function did not complete successfully!");
  113. break;
  114. case SNMPAPI_ALLOC_ERROR:
  115. AfxMessgeBox("error in memory allocation");
  116. break;
  117. case SNMPAPI_OID_INVALID:
  118. AfxMessgeBox("invalid Oid ");
  119. break;
  120. case SNMPAPI_OTHER_ERROR :
  121. AfxMessgeBox( " other error");
  122. break;
  123. default:
  124. break
  125. }*/
  126. if(SnmpSetVb(m_hvbl,0,pOid,NULL)==SNMPAPI_FAILURE) /*0--1*/
  127. {AfxMessageBox("SetVbl failure");
  128. //dwErr=SnmpGetLastError(session);
  129. }
  130. if(pOid!=NULL)
  131. delete pOid;
  132. }
  133. CSNMP1::CreatePdu(smiINT PDU_type,smiINT32 request_id,
  134.  smiINT error_status,smiINT error_index)
  135. {
  136. m_hpdu=SnmpCreatePdu(session,PDU_type,NULL,error_status,error_index,m_hvbl);
  137. if(m_hpdu==SNMPAPI_FAILURE)
  138. {
  139. AfxMessageBox("CreatePdu failure");
  140. //dwErr=SnmpGetLastError(session);
  141. }
  142. else if (error_status > 0)/* 进对getBulk*/
  143.                 {
  144.                // AfxMessageBox("Error: error_status=%d, error_index=%dn",
  145.                //      error_status, error_index);
  146.             }
  147. }
  148. CSNMP1::Send(LPCSTR address,const char * community)
  149. {
  150. // oldMemState.Checkpoint();
  151. HSNMP_ENTITY hAgent;
  152. if((hAgent=SnmpStrToEntity(session,address))==SNMPAPI_FAILURE)
  153. AfxMessageBox("SendMsg failure--entity");
  154. smiOCTETS contextName;
  155. contextName.ptr=(unsigned char *)community;
  156. contextName.len=lstrlen(community);
  157. HSNMP_CONTEXT hView;
  158. if((hView=SnmpStrToContext(session,&contextName))==SNMPAPI_FAILURE)
  159. AfxMessageBox("SendMsg failure--context");
  160.    if(SnmpSendMsg(session,NULL,hAgent,hView,m_hpdu)==SNMPAPI_FAILURE)
  161. {
  162. AfxMessageBox("SendMsg failure");
  163. //dwErr=SnmpGetLastError(session);
  164. CString str;
  165. str.Format("%d",SnmpGetLastError(session));
  166. AfxMessageBox(str);
  167. }
  168. if(m_hpdu!=NULL)
  169. SnmpFreePdu(m_hpdu);
  170. if(m_hvbl!=NULL)
  171. SnmpFreeVbl(m_hvbl);
  172. if(hAgent!=NULL)
  173. SnmpFreeEntity(hAgent);
  174. if(hView!=NULL)
  175. SnmpFreeContext(hView);
  176. }
  177. CSNMP1::Register()
  178. {
  179. SNMPAPI_STATUS  dwErr;
  180. if(SnmpRegister(session,NULL,NULL,NULL,NULL,SNMPAPI_ON)==SNMPAPI_FAILURE)
  181. {
  182. AfxMessageBox("Register failure");
  183. if((dwErr=SnmpGetLastError(session_trap))==SNMPAPI_SUCCESS)
  184. AfxMessageBox("strange");
  185. CString str;
  186. str.Format("%d",dwErr);
  187. AfxMessageBox(str);
  188. }
  189. }
  190. int CSNMP1::Receive(LPTSTR *name,smiLPVALUE *value,smiLPINT PDU_type,char* pSrc)
  191. {
  192. HSNMP_ENTITY srcEntity; 
  193. HSNMP_ENTITY dstEntity; 
  194. HSNMP_CONTEXT context; // store for the COMMUNITY field
  195. HSNMP_PDU pPdu;
  196.    smiLPINT32 request_id=new smiINT32;
  197. smiLPINT error_status=new smiINT;
  198. smiLPINT error_index=new smiINT;
  199. HSNMP_VBL varbindlist;
  200. smiLPOID pOid=new smiOID;
  201. if(SnmpRecvMsg(session,&srcEntity,&dstEntity,&context,&pPdu)!=SNMPAPI_SUCCESS)
  202. {
  203. // CString str;
  204. // str.Format("%d",SnmpGetLastError(NULL));
  205. // AfxMessageBox(str);
  206. //AfxMessageBox("receive failure--recv");
  207. return 0;
  208. }
  209. if(SnmpGetPduData(pPdu,PDU_type,request_id,error_status,error_index,&varbindlist)!=SNMPAPI_SUCCESS)
  210. {
  211. /* AfxMessageBox("receive failure--getpdu");
  212. CString str;
  213. str.Format("%d",SnmpGetLastError(NULL));
  214. AfxMessageBox(str);*/
  215. return 0;
  216. }
  217. if((nCount=SnmpCountVbl(varbindlist))==SNMPAPI_FAILURE)
  218. //AfxMessageBox("Count Vbl Error");
  219. return 0;
  220. for(int i=1;i<=nCount;i++)
  221. {
  222. if(SnmpGetVb(varbindlist,i,pOid,value[i])!=SNMPAPI_SUCCESS)
  223. {
  224. /* AfxMessageBox("receive failure--getvb");
  225. CString str;
  226. str.Format("%d",SnmpGetLastError(NULL));
  227. AfxMessageBox(str);*/
  228. return 0;
  229. }
  230. if(SnmpOidToStr(pOid,100,name[i])==SNMPAPI_FAILURE)
  231. {  
  232. /*AfxMessageBox("Get Vb Error");
  233. CString str;
  234. str.Format("%d",SnmpGetLastError(NULL));
  235. AfxMessageBox(str);*/
  236. return 0;
  237. }
  238. }
  239. //SnmpOidToStr(pOid,100,name[i]); 
  240.   /* insert here the processing routines, such as :
  241. 1.Check whether the PDU_type is GetResponse PDU or Trap PDU  
  242.     2.if PDU_type is GetResponse PDU, verify its requestid.  else goto step 5
  243. 3.Record error_status, error_index, into the MIB-II snmp group 
  244.     4.Store requested data into database 
  245. 5. intriger Trap handle process.*/
  246. //if (*PDU_type==SNMP_PDU_TRAP )
  247. //{
  248.       SnmpEntityToStr(srcEntity,100,pSrc);
  249. /* smiOCTETS* a;
  250. SnmpContextToStr(context,a);
  251. CString test
  252. =a->ptr;
  253. AfxMessageBox(test);*/
  254.         
  255. //}
  256. SnmpFreeEntity(srcEntity);
  257. SnmpFreeEntity(dstEntity);
  258. SnmpFreeContext(context);
  259. SnmpFreePdu(pPdu);
  260. SnmpFreeVbl(varbindlist);
  261. //SnmpFreeDescriptor(SNMP_SYNTAX_OID,*pOid);
  262. // delete PDU_type; 
  263. delete request_id;
  264. delete error_status;
  265. delete error_index;
  266. delete pOid;
  267. return 1;
  268.  }