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拷贝到这个项目的目录下面,就可以编译了:
生成->生成解决方案