技术开发 频道

简单SNMP管理程序VC++实例

  3. 测试示例

  ①监听SNMP的端口

D:\>cd WIN2000_DEBUG D:\WIN2000_DEBUG>wsnmputil trap WSnmpUtil: listening for traps...
  ②另外打开一个VC命令行窗口
D:\WIN2000_DEBUG>net stop snmp SNMP Service 服务正在停止.. SNMP Service 服务已成功停止。 D:\WIN2000_DEBUG>net start snmp SNMP Service 服务正在启动 . SNMP Service 服务已经启动成功。 D:\WIN2000_DEBUG>
  ③按照其readme里所描述的,在第一个监听窗口会出现以下信息:
D:\WIN2000_DEBUG>wsnmputil trap WSnmpUtil: listening for traps... Agent : 127.0.0.1 OID :1.3.6.1.2.1.1.3.0 OID string: system.sysUpTime.0 TIMETICKS: 0
  ④再测试几个命令
D:\WIN2000_DEBUG>wsnmputil usage: wsnmputil [-v1|-v2][get|getnext|walk|getbulk|subtree] agent community [non_repeaters max_repetitions] oid [oid ...] Examples: wsnmputil trap wsnmputil -v1 get localhost public 1.3.6.1.2.1.1.1.0 wsnmputil -v1 getnext localhost public 1.3.6.1.2.1.1.1.0 wsnmputil -v1 subtree localhost public 1.3.6.1.2.1.1 wsnmputil -v1 set toaster public 1.3.6.1.4.1.12.2.5.0 2 wsnmputil -v2 walk localhost public 1 wsnmputil -v2 getbulk toaster public 1 2 1.3.6.1.2.1.1.2.0 1.3.6.1.2.1.4.2 2.1.2 1.3.6.1.2.1.4.22.1.4 D:\WIN2000_DEBUG>wsnmputil -v2 walk localhost public 1 D:\WIN2000_DEBUG>wsnmputil -v1 get localhost public 1 OID :1.3.6.1.2.1.1 system NULL – NULL D:\WIN2000_DEBUG>wsnmputil -v1 getnext localhost public 1.3.6.1.2.1.1.1.0 OID :1.3.6.1.2.1.1.2.0 system.sysObjectID.0 OBJECT IDENTIFIER - .1.3.6.1.4.1.311.1.1.3.1.1
代码分析
 
  一共三个文件:WSnmpUtil.h WSnmpUtil.Cpp Helper.Cpp,具体代码在后面贴出,这里分析一下其大体结构:
 
  1. WSnmpUtil.h
 
  21个常量定义,一个结构体类型声明,一个GlobalVars类声明,以及19个函数声明。
 
  2. Helper.Cpp
 
  一些函数定义,比如输出提示消息,解析命令行输入的命令,调试信息,地址转换,输出Oid地址以及pSession的参数。
 
  3. WSnmpUtil.Cpp
 
  程序骨干如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <winsock2.h> #include <winsnmp.h> #include <snmp.h> #include <mgmtapi.h> #include "WSnmpUtil.h" GlobalVars gVars; int main( int argc, char **argv ) { PSNMP_MGR_SESSION pSession = NULL;  int nReturn = 0;  BOOL result;  int i = 0;  smiUINT32 nMajorVersion = 0;  smiUINT32 nMinorVersion = 0;  smiUINT32 nLevel = 0;  smiUINT32 nTranslateMode = 0;  smiUINT32 nRetransmitMode = 0;  ParseCommandLine( argc, argv );  SnmpStartup(&nMajorVersion,&nMinorVersion,&nLevel, &nTranslateMode,&nRetransmitMode);  if ( gVars.version == FALSE )   SnmpSetTranslateMode( SNMPAPI_UNTRANSLATED_V1 );  else   SnmpSetTranslateMode( SNMPAPI_UNTRANSLATED_V2 );  pSession = ( PSNMP_MGR_SESSION ) SnmpUtilMemAlloc( sizeof( SNMP_MGR_SESSION ) );  CreateNotificationWindow( pSession );  //建立会话  SnmpOpen( pSession->hWnd, WM_SNMP_INCOMING );  //解析用户在命令行输入的命令  switch (gVars.operation)  {   case TRAP:WaitForTraps( pSession ); break;   case WALK:CreatePduSendRequest( pSession, NULL ); break;   case GET:   case GET_NEXT:result = CreatePduSendRequest( pSession, NULL ); break;   //创建一个PDU并发送一个请求   case GET_BULK:result = CreatePduSendRequest( pSession, NULL ); break;   case SUB_TREE:result = CreatePduSendRequest( pSession, NULL ); break;   case SET:result = CreatePduSendRequest( pSession, NULL ); break;   //先探测所给agent是否存在,之后再发送设定消息  }  CloseWinSNMPSession ( pSession ); //关闭WinSNMP任务,调用了SnmpClose()  SnmpUtilMemFree( pSession );//释放内存  SnmpCleanup( );//清理工作  WSACleanup( );//关闭windows sockets  return ( nReturn ); } //end of main()
其他说明
 
  用VC编译
 
  打开VC.net,按以下操作路径:
 
  文件->新建->项目->VC++项目->常规->生成文件项目->起个名字->确定->应用程序设置->在生成命令行里输入nmake->完成
 
  然后把那三个文件及makefile拷贝到这个项目的目录下面,就可以编译了:
 
  生成->生成解决方案

0
相关文章