snmp.txt
上传用户:qunchaozh
上传日期:2022-02-05
资源大小:3k
文件大小:7k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. 【IT168技术文档】
  2.   SNMP(Simple Network Management Protocol)是基于TCP/IP的网络管理协议,关于其工作原理网上很多,百度一下或者看看MSDN,今天在这里记一下实现的步骤,本人工作环境是Windows XP professional SP2 + Microsoft Visual Studio .net 2003,不保证其他平台与本人的步骤一致。  安装SNMP服务   先查看系统中是否已经安装有SNMP服务,开始->运行->cmd->回车  输入命令“net start snmp”:
  3. C:Documents and Settingsmmpire>net start snmp SNMP Service 服务正在启动 . SNMP Service 服务已经启动成功。 C:Documents and Settingsmmpire>
  4.   则已经安装有SNMP,如果没有安装,则需先安装SNMP服务:   1. 打开控制面板,双击[添加/删除程序];   2. 在弹出的[添加/删除程序]对话框的左窗格中,单击 [添加/删除 Windows 组件];   3. 在弹出的[Windows 组件向导]中双击 [管理和监视工具]。   4. 在弹出的[管理和监视工具] 对话框中,勾选[简单网络管理协议],单击 [确定]。   5. 安装协议时需要用到Windows XP SP2安装盘,之后可能需要重启,不过我的机器没要求:P   再按前面的执行“net start snmp”命令启动SNMP服务。 代码示例   这种编程一般都有套路,即需要遵循一定的格式,MS提供了SNMP编程的样例代码,这个样例是一个最简单的Snmp管理程序,用户通过输入Snmp命令来进行交互。我们可以从中查看WinSNMP的API的使用方法。所有样例代码都在Platform SDK中。   可以看看它的介绍(几乎支持了所有现在的Windows版本),只要下载全部17个PSDK-FULL.*.cab及最后一个PSDK-FULL.exe,之后全部解压缩并安装到某个文件夹中即可。   1. 找到示例代码   进入platformsdkSamplesNetDSSnmp,可以看到三个文件夹:SnmpUtil,TestDll,Wsnmp以及一个Makefile。其中SnmpUtil与TestDll是基于NT平台的,略去不说,具体参看内附的readme。而Makefile是用来编译所有这三个文件里的模块的,对于XP平台前两个文件夹里的模块不能正确编译,所以也不看。进入Wsnmp文件夹,我们需要的示例代码就在这里。将五个文件全拷贝到D盘根目录。   2. 编译示例代码   打开VC命令行窗口,输入以下命令:
  5. C:Documents and Settingsmmpire>d: D:>nmake all Microsoft (R) 程序维护实用工具 7.10.3077 版 版权所有 (C) Microsoft Corporation。保留所有权利。 if not exist "WIN2000_DEBUG/" mkdir WIN2000_DEBUG cl -Zi -Od -DDEBUG -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -D_X86_=1-DWIN32 -D_WIN32 -W3 -D_WINNT -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 –DWINV ER=0x0500 -D_MT -MTd /Fo"WIN2000_DEBUG\" /Fd"WIN2000_DEBUG\" wsnmputil.cpp wsnmputil.cpp cl -Zi -Od -DDEBUG -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -D_X86_=1 -DWIN32 -D_WIN32 -W3 -D_WINNT -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 –DWINV ER=0x0500 -D_MT -MTd /Fo"WIN2000_DEBUG\" /Fd"WIN2000_DEBUG\" helper.cpp helper.cpp link /DEBUG:full /DEBUGTYPE:cv /INCREMENTAL:NO /NOLOGO -subsystem:conso le,5.0 kernel32.lib ws2_32.lib mswsock.lib advapi32.lib -out:WIN2000_DEBUGwsnm putil.exe WIN2000_DEBUGwsnmputil.obj WIN2000_DEBUGhelper.obj user32.lib gdi32.lib snmpapi.lib wsnmp32.lib mgmtapi.lib oldnames.lib
  6.   可以发现当前目录下出现一个子目录WIN2000_DEBUG,也可以用nmake删除:
  7. D:>nmake clean Microsoft (R) 程序维护实用工具 7.10.3077 版 版权所有 (C) Microsoft Corporation。保留所有权利。 if exist WIN2000_DEBUG/ rd /s /q WIN2000_DEBUG
  8.   当然现在我们还需要它,根据其readme文件所述,这个示例代码是一个SNMP管理程序(SNMP Manager Application),展示了如何使用WinSNMP的API编写应用程序。它支持SNMP 1的Get,GetNext,Set操作,以及SNMP2的GetBulk操作。而扩展的Walk和Subtree操作则使用GetNext操作来实现。
  9.   ①监听SNMP的端口
  10. D:>cd WIN2000_DEBUG D:WIN2000_DEBUG>wsnmputil trap WSnmpUtil: listening for traps...
  11.   ②另外打开一个VC命令行窗口
  12. D:WIN2000_DEBUG>net stop snmp SNMP Service 服务正在停止.. SNMP Service 服务已成功停止。 D:WIN2000_DEBUG>net start snmp SNMP Service 服务正在启动 . SNMP Service 服务已经启动成功。 D:WIN2000_DEBUG>
  13.   ③按照其readme里所描述的,在第一个监听窗口会出现以下信息:
  14. 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
  15.   ④再测试几个命令
  16. 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
  17. 代码分析   一共三个文件:WSnmpUtil.h WSnmpUtil.Cpp Helper.Cpp,具体代码在后面贴出,这里分析一下其大体结构:   1. WSnmpUtil.h   21个常量定义,一个结构体类型声明,一个GlobalVars类声明,以及19个函数声明。   2. Helper.Cpp   一些函数定义,比如输出提示消息,解析命令行输入的命令,调试信息,地址转换,输出Oid地址以及pSession的参数。   3. WSnmpUtil.Cpp   程序骨干如下:
  18. #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                                           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()
  19. 其他说明   用VC编译   打开VC.net,按以下操作路径:   文件->新建->项目->VC++项目->常规->生成文件项目->起个名字->确定->应用程序设置->在生成命令行里输入nmake->完成   然后把那三个文件及makefile拷贝到这个项目的目录下面,就可以编译了:   生成->生成解决方案