AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

简单SNMP管理程序的VC++代码实例实现

51自学网 2015-08-30 http://www.wanshiok.com

  三、代码分析

  一共三个文件: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"
//外部全局变量gVars,记录用户命令等信息

GlobalVars gVars;

int main( int argc, char **argv )
{ //初试化一般参数
 PSNMP_MGR_SESSION pSession = NULL;
 int nReturn = 0;
 BOOL result;
 int i = 0;

 //初试化SNMP参数

 smiUINT32 nMajorVersion = 0;
 smiUINT32 nMinorVersion = 0;
 smiUINT32 nLevel = 0;
 smiUINT32 nTranslateMode = 0;
 smiUINT32 nRetransmitMode = 0;

 //接收用户在命令行输入的命令,主要记录在变量gVars中

 ParseCommandLine( argc, argv );

 //加载SNMP服务

 SnmpStartup(&nMajorVersion,&nMinorVersion,&nLevel,&nTranslateMode,&nRetransmitMode);

 //分两种情况设置传输模式(SNMP1/SNMP2)

 if ( gVars.version == FALSE )
  SnmpSetTranslateMode( SNMPAPI_UNTRANSLATED_V1 );
 else
  SnmpSetTranslateMode( SNMPAPI_UNTRANSLATED_V2 );
 //为会话分配内存空间
 pSession = ( PSNMP_MGR_SESSION )SnmpUtilMemAlloc( sizeof( SNMP_MGR_SESSION ) );

 /*创建一个隐藏的负责监听WinSNMP消息的窗口,这是一段典型的调用CreateWindow()创建windows窗口的代码。(注:窗口处理函数是NotificationWndProc(),本程序调用CreatWindow()后返回,而由系统来创建窗口,其中就要调用这个窗口处理函数,这种由程序员编写而由系统调用的函数需要定义为CALLBACK函数)注意:SNMP接收的数据包(PDU)就在窗口进程里处理*/

 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()

  四、其他说明

  1. 用VC编译

  方法一:

  建立工程并添加上述三个文件,这时可以编译通过,但链接是会出现许多错误,大多是“未能解析的符号”,这时我们还需要给工程添加一些库,操作路径如下:

  项目->属性->链接器->命令行

  在“附加选项”中加入

"user32.lib gdi32.lib snmpapi.lib wsnmp32.lib mgmtapi.lib oldnames.lib Ws2_32.lib"

  前面的lib库摘自其makefile,最后一个Ws2_32.lib是google出来的:P

  方法二:

  打开VC.net,按以下操作路径:

  文件->新建->项目->VC++项目->常规->生成文件项目->起个名字->确定->应用程序设置->在生成命令行里输入nmake->完成

  然后把那三个文件及makefile拷贝到这个项目的目录下面,就可以编译了:

  生成->生成解决方案

  方法三:

  前面说过了,打开VC的命令行窗口直接用nmake命令:P

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:VC++与Matlab混合编程之引擎操作详解  下一篇:利用VC++实现局域网实时视频传输