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

SNMP编程

开发平台:

Visual C++

  1. // Snmp1.cpp : implementation file
  2. #include "stdafx.h"
  3. #include "Snmp.h"
  4. #include "Winsock2.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. CSnmp::CSnmp()
  11. {
  12.   if(SnmpStartup(&nMajorVersion,&nMinorVersion,&nLevel,&nTranslateMode,
  13.   &nRetransmitMode)!=SNMPAPI_SUCCESS)
  14.  AfxMessageBox("initilization failure");
  15. if(SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V1)!=SNMPAPI_SUCCESS)
  16. AfxMessageBox("SetTranslateMode failure");
  17. if(SnmpSetRetransmitMode(SNMPAPI_ON)!=SNMPAPI_SUCCESS)
  18. AfxMessageBox("SetRetransmitMode failure");
  19. m_hSession=NULL;
  20. m_hvbl=NULL;
  21. state=0;
  22. }
  23. CSnmp::~CSnmp()
  24. {
  25. if(m_hSession!=NULL)
  26. SnmpClose(m_hSession);
  27. SnmpCleanup();
  28. }
  29. BOOL CSnmp::CreateSession()
  30. {
  31. if (m_hSession)
  32. {
  33. AfxMessageBox("m_hSession has been created!");
  34. return TRUE;
  35. }
  36. if((m_hSession=SnmpCreateSession(NULL,0,SnmpCallback, (LPVOID)this))==SNMPAPI_FAILURE)
  37. {
  38. AfxMessageBox("Createm_hSession failure");
  39. return FALSE;
  40. };
  41. return TRUE;
  42. }
  43. //Callback function for snmp notify
  44. SNMPAPI_STATUS CALLBACK CSnmp::SnmpCallback(
  45. HSNMP_SESSION hSession,  // handle to the WinSNMP m_hSession
  46. HWND hWnd,               // handle to the notification window
  47. UINT wMsg,               // window notification message number
  48. WPARAM wParam,           // type of notification
  49. LPARAM lParam,           // request identifier of PDU
  50. LPVOID lpClientData)     // optional application-defined data
  51. {
  52. if (wParam==SNMPAPI_TL_TIMEOUT)
  53. ((CSnmp *)lpClientData)->state=1;
  54. ((CSnmp *)lpClientData)->m_Event.SetEvent();
  55. return SNMPAPI_SUCCESS;
  56. }
  57. BOOL CSnmp::CreateVbl(LPCSTR name,smiLPVALUE pvalue)
  58. {
  59. BOOL bRet=FALSE;
  60. smiLPOID pOid=NULL;
  61. if (name!=NULL)
  62. {
  63. pOid=new smiOID;
  64. if(SnmpStrToOid(name,pOid)==SNMPAPI_FAILURE)
  65. {
  66. AfxMessageBox("CreateVbl failure");
  67. bRet=FALSE;
  68. goto out;
  69. };
  70. };
  71. m_hvbl=SnmpCreateVbl(m_hSession,pOid,pvalue);
  72. if(m_hvbl==SNMPAPI_FAILURE)
  73. {
  74. AfxMessageBox("CreateVbl failure");
  75. bRet=FALSE;
  76. goto out;
  77. }
  78. out:
  79. //dwErr=SnmpGetLastError(m_hSession);
  80. if(pOid!=NULL)
  81. delete pOid;
  82. return bRet;
  83. }
  84. BOOL CSnmp::SetVbl(LPCSTR name,smiLPCVALUE value)
  85. {
  86. BOOL bRet=TRUE;
  87. smiLPOID pOid=new smiOID;
  88. if(SnmpStrToOid(name,pOid)==SNMPAPI_FAILURE)
  89. {
  90. AfxMessageBox("SetVbl failure--oid");
  91. //dwErr=SnmpGetLastError(m_hSession);
  92. bRet=FALSE;
  93. }
  94. if(SnmpSetVb(m_hvbl,0,pOid,NULL)==SNMPAPI_FAILURE)
  95. {
  96. AfxMessageBox("SetVbl failure");
  97. //dwErr=SnmpGetLastError(m_hSession);
  98. bRet=FALSE;
  99. }
  100. if(pOid!=NULL)
  101. delete pOid;
  102. return bRet;
  103. }
  104. BOOL CSnmp::CreatePdu(smiINT PDU_type,smiINT32 request_id,
  105.  smiINT error_status,smiINT error_index)
  106. {
  107. m_hpdu=SnmpCreatePdu(m_hSession,PDU_type,NULL,error_status,error_index,m_hvbl);
  108. if(m_hpdu==SNMPAPI_FAILURE)
  109. {
  110. AfxMessageBox("CreatePdu failure");
  111. return FALSE;
  112. //dwErr=SnmpGetLastError(m_hSession);
  113. }
  114. else if (error_status > 0)
  115.     {
  116. AfxMessageBox("Error: error_status=%d, error_index=%dn",
  117.                        error_status, error_index);
  118. return FALSE;
  119. }
  120. return TRUE;
  121. }
  122. BOOL CSnmp::Send(LPCSTR address)
  123. {
  124. state=0;
  125. BOOL bRet=TRUE;
  126. HSNMP_ENTITY hAgent;
  127. if((hAgent=SnmpStrToEntity(m_hSession,address))==SNMPAPI_FAILURE)
  128. AfxMessageBox("SendMsg failure--entity");
  129. smiOCTETS contextName;
  130. contextName.ptr=(unsigned char *)(m_community.GetBuffer(30));
  131. contextName.len=lstrlen(m_community);
  132. HSNMP_CONTEXT hView;
  133. if((hView=SnmpStrToContext(m_hSession,&contextName))==SNMPAPI_FAILURE)
  134. {
  135. AfxMessageBox("SendMsg failure--context");
  136. bRet=FALSE;
  137. }
  138. if(SnmpSendMsg(m_hSession,NULL,hAgent,hView,m_hpdu)==SNMPAPI_FAILURE)
  139. {
  140. AfxMessageBox("SendMsg failure");
  141. //dwErr=SnmpGetLastError(m_hSession);
  142. CString str;
  143. str.Format("%d",SnmpGetLastError(m_hSession));
  144. AfxMessageBox(str);
  145. bRet=FALSE;
  146. }
  147. if(m_hpdu!=NULL)
  148. SnmpFreePdu(m_hpdu);
  149. if(m_hvbl!=NULL)
  150. SnmpFreeVbl(m_hvbl);
  151. if(hAgent!=NULL)
  152. SnmpFreeEntity(hAgent);
  153. if(hView!=NULL)
  154. SnmpFreeContext(hView);
  155. return bRet;
  156. }
  157. BOOL CSnmp::Register()
  158. {
  159. /* if(SnmpRegister(NULL,NULL,NULL,NULL,NULL,SNMPAPI_ON)==SNMPAPI_FAILURE)
  160. {
  161. AfxMessageBox("Register failure");
  162. if((dwErr=SnmpGetLastError(m_hSession))=SNMPAPI_SUCCESS)
  163. AfxMessageBox("strange");
  164. CString str;
  165. str.Format("%d",dwErr);
  166. AfxMessageBox(str);
  167. }*/
  168. return TRUE;
  169. }
  170. BOOL CSnmp::Receive()
  171. {
  172. if (!Receive(m_strOid,m_value))
  173. return FALSE;
  174. CString strIp,strTemp;
  175. for(int i=0;i<nCount;i++)
  176. {
  177. switch(m_value[i].syntax)
  178. {
  179. case SNMP_SYNTAX_INT: 
  180. // case SNMP_SYNTAX_INT32:
  181. smiINT sNumber;
  182. sNumber=m_value[i].value.sNumber;
  183. m_strValue[i].Format("d",sNumber);
  184. break;
  185. case SNMP_SYNTAX_UINT32:
  186. case SNMP_SYNTAX_CNTR32:
  187. case SNMP_SYNTAX_GAUGE32: 
  188. case SNMP_SYNTAX_TIMETICKS:
  189. smiUINT32 uNumber;
  190. uNumber=m_value[i].value.uNumber;
  191. m_strValue[i].Format("d",uNumber);
  192. break;
  193. case SNMP_SYNTAX_CNTR64:
  194. smiCNTR64 hNumber;
  195. hNumber=m_value[i].value.hNumber;
  196. // m_strValue[i].Format("d",hNumber.hipart*4294967296+hNumber.lopart);
  197. break;
  198. case SNMP_SYNTAX_OCTETS: 
  199. case SNMP_SYNTAX_OPAQUE: 
  200. case SNMP_SYNTAX_NSAPADDR:
  201. m_strValue[i]=(char *)m_value[i].value.string.ptr;
  202. break;
  203. case SNMP_SYNTAX_IPADDR:
  204. in_addr ipAddr;
  205. unsigned long iAddr;
  206. iAddr=*((unsigned long *)(m_value[i].value.string.ptr));
  207. ipAddr.S_un.S_addr=iAddr;
  208. m_strValue[i]=inet_ntoa(ipAddr);
  209. /* ipAddr.S_un.S_addr=ntohs(((unsigned long *)(m_value[i]->value.string.ptr)));
  210. strIp.Format("%d",*m_value[i].value.string.ptr);
  211. strIp+=".";
  212. strTemp.Format("%d",*(m_value[i].value.string.ptr+1));
  213. strIp+=strTemp;
  214. strIp+=".";
  215. strTemp.Format("%d",*(m_value[i].value.string.ptr+2));
  216. strIp+=strTemp;
  217. strIp+=".";
  218. strTemp.Format("%d",*(m_value[i].value.string.ptr+3));
  219. strIp+=strTemp;
  220. m_strValue[i]=strIp;//*/
  221. break;
  222. case SNMP_SYNTAX_OID:
  223. smiOID oid=m_value[i].value.oid;
  224. char str[100];
  225. SnmpOidToStr(&oid,30,str);
  226. m_strValue[i]=str;
  227. //SnmpFreeDescriptor (SNMP_SYNTAX_OID, (smiLPOPAQUE)&oid);
  228. break;
  229. case SNMP_SYNTAX_NULL: 
  230. case SNMP_SYNTAX_NOSUCHOBJECT:
  231. case SNMP_SYNTAX_NOSUCHINSTANCE: 
  232. case SNMP_SYNTAX_ENDOFMIBVIEW:
  233. smiBYTE empty;
  234. empty=m_value[i].value.empty;
  235. m_strValue[i]="No Value Returned";
  236. break;
  237. default:
  238. break;
  239. };
  240. }
  241. return TRUE;
  242. }
  243. BOOL CSnmp::Receive(CString name[],smiVALUE value[])
  244. {
  245. if (state==1)
  246. {
  247. AfxMessageBox("Request TimeOut!");
  248. for (int i=0;i<10;i++)
  249. {
  250. name[i]="Unkown";
  251. value[i].syntax=SNMP_SYNTAX_NULL;
  252. }
  253. return FALSE;
  254. }
  255. BOOL bRet=TRUE;
  256. HSNMP_ENTITY srcEntity; 
  257. HSNMP_ENTITY dstEntity; 
  258. HSNMP_CONTEXT context;
  259. HSNMP_PDU pPdu;
  260. HSNMP_VBL varbindlist;
  261. smiOID Oid;
  262. if(SnmpRecvMsg(m_hSession,&srcEntity,&dstEntity,&context,&pPdu)!=SNMPAPI_SUCCESS)
  263. {
  264. AfxMessageBox("receive failure--recv");
  265. bRet=FALSE;
  266. }
  267. CHAR aa[100]; 
  268. SnmpEntityToStr(srcEntity,100,aa);
  269. strSrcEntity=aa;
  270. SnmpEntityToStr(dstEntity,100,aa);
  271. strDstEntity=aa;
  272. if(SnmpGetPduData(pPdu,&PDU_type,&request_id,&error_status,&error_index,&varbindlist)!=SNMPAPI_SUCCESS)
  273. {
  274. AfxMessageBox("receive failure--getpdu");
  275. CString str;
  276. str.Format("%d",SnmpGetLastError(NULL));
  277. AfxMessageBox(str);
  278. bRet=FALSE;
  279. }
  280. if (PDU_type!=SNMP_PDU_RESPONSE)
  281. {
  282. AfxMessageBox("Unknown package!");
  283. bRet=FALSE;
  284. }
  285. if((nCount=SnmpCountVbl(varbindlist))==SNMPAPI_FAILURE)
  286. {
  287. AfxMessageBox("Count Vbl Error");
  288. bRet=FALSE;
  289. }
  290. if (nCount>10)
  291. {
  292. AfxMessageBox("No buff,The number of parameters returned >10!");
  293. bRet=FALSE;
  294. }
  295. for(int i=0;i<nCount;i++)
  296. {
  297. if(SnmpGetVb(varbindlist,i+1,&Oid,&value[i])!=SNMPAPI_SUCCESS)
  298. {
  299. AfxMessageBox("receive failure--getvb");
  300. CString str;
  301. str.Format("%d",SnmpGetLastError(NULL));
  302. AfxMessageBox(str);
  303. bRet=FALSE;
  304. }
  305. char buff[100];
  306. if(SnmpOidToStr(&Oid,100,buff)==SNMPAPI_FAILURE)
  307. {
  308. AfxMessageBox("Get Vb Error");
  309. CString str;
  310. str.Format("%d",SnmpGetLastError(NULL));
  311. AfxMessageBox(str);
  312. bRet=FALSE;
  313. }
  314. name[i]=buff;
  315. }
  316. SnmpFreeEntity(srcEntity);
  317. SnmpFreeEntity(dstEntity);
  318. SnmpFreeContext(context);
  319. SnmpFreePdu(pPdu);
  320. SnmpFreeVbl(varbindlist);
  321. //SnmpFreeDescriptor(SNMP_SYNTAX_OID,&Oid);
  322. return bRet;
  323. }
  324. void CSnmp::ReportError(DWORD dwError)
  325. {
  326. return;
  327. }
  328. void CSnmp::ReInitial()
  329. {
  330. if(m_hpdu!=NULL)
  331. SnmpFreePdu(m_hpdu);
  332. if(m_hvbl!=NULL)
  333. SnmpFreeVbl(m_hvbl);
  334. }
  335. BOOL CSnmp::WaitForResponse()
  336. {
  337. WaitForSingleObject((HANDLE)m_Event, INFINITE);
  338. m_Event.ResetEvent();
  339. if (state==1)
  340. {
  341. state=0;
  342. return FALSE;
  343. }
  344. return TRUE;
  345. }
  346. BOOL CSnmp::IsCreated()
  347. {
  348. if (m_hSession)
  349. return TRUE;
  350. return FALSE;
  351. }