网络管理讲义WinSnmp应用简介.ppt
WinSnmp简介,主要内容,WinSnmp 概念和结构 WinSnmp 的几个重要概念 WinSnmp 常用函数介绍 WinSnmp GetNext实现方法 举例说明,什么是WinSnmp,WinSNMP的目的是为在Windows下开发基于SNMP的网络管程序提供解决方案。它为SNMP网管开发者提供了必须遵循的开放式单一接口规范,它定义了过程调用、数据类型、数据结构和相关的语法。总的来说,WinSNMP以函数的形式封装了SNMP协议的各部分(在VC+6.0开发环境中体现为wsnmp32.dll、wsnmp32.lib和winsnmp.h),且针对SNMP是使用UDP的特点而设置了消息重传、超时机制等。,WinSnmp 体系结构,WinSnmp 几个重要的概念,在此我们主要介绍在VC6.0下Snmp的管理站程序设计,WinSnmp 几个重要的概念,Community(共同体名):我们可以将此名称理解为带有权限的登陆名称。一般权限分为只读权限(默认为public)和读写权限(默认为private)。Oid(对象标识符):是以SMI(Structure of Management Information)管理信息结构为基础的一系列点分符号,如,这些点分符号在任何网络设备中都唯一标识某一个数据参数。他们的集合就是MIB(Management Information Base)管理信息库。,WinSnmp 几个重要的概念,SNMP支持层次:WinSNMP支持四个层次的SNMP操作:Level 0=只有消息编码/解码 Level 1=Level 0+与SNMPv1代理的通信 Level 2=Level 1+与SNMPv2代理的通信 Level 3=Level 2+与其它SNMPv2管理站的通信因为SNMP协议支持SNMPv1与SNMPv2的共存,所以WinSNMP实现能提供对两个版本协议的支持。SnmpStartup函数能返回当前WinSNMP实现所能提供的最大支持层次。,WinSnmp 几个重要的概念,三种Entity/Context转换模式如下:SNMPAPI_TRANSLATED=通过本地数据库查询转换SNMPAPI_UNTRANSLATED_V1=转换为IP地址和共同体(community)字符串SNMPAPI_UNTRANSLATED_V2=SNMPv2的party和context IDs.我们可以通过SnmpStartup函数获得当前默认的entity/context转换模式,SnmpSetTranslatedMode函数可以用来设置entity/context转换模式。,WinSnmp 几个重要的概念,本地数据库(Local Database)本地数据库主要存储重传模式(RetransmitMode)、重试次数(Retry)、超时(timeout)、转换模式(TranslateMode)等值。我们可以对其中的数据进行读(get)、写(set)操作。,WinSnmp 几个重要的概念,会话(session)会话是用来管理WinSNMP应用程序和WinSNMP实现之间的连接,由SnmpCreateSession(推荐)或SnmpOpen函数创建。会话是资源管理的最小单位,也是WinSNMP应用程序和WinSNMP实现之间通信管理的最小单位。一个好的WinSNMP应用程序应该使用会话结构逻辑地管理它的操作,并将实现中的资源需求控制在最小。调用SnmpCreateSession或SnmpOpen函数创建一个会话时,会返回一个“session id”,这是一个句柄(handle)变量,WinSNMP用它来管理自己的资源。应用程序最终应调用SnmpClose函数将会话释放。,WinSnmp 几个重要的概念,异步模式:WinSNMP API中几乎所有函数都有异步成分,有些则是完全异步的。有三个非常重要的异步函数:SnmpSendMsg(发送数据)SnmpRecvMsg(接收数据)SnmpRegister(注册接受trap消息)WinSNMP的整个编程模式就是基于异步和消息驱动的。,WinSnmp 几个重要的概念,内存管理(Memory Management)WinSNMP包括三种不同的内存“对象”:句柄式资源 C风格(以NULL结尾)的字符串 WinSNMP API结构类型 五种句柄式资源:HSNMP_SESSION,HSNMP_ENTITY HSNMP_CONTEXT,HSNMP_PDU HSNMP_VBL,WinSnmp 几个重要的概念,C风格字符串(C-Stytle Strings)C风格的字符串主要用来为通用的字符串表示与Entity和对象标识符(OID)对象之间的转换提供便利。WinSNMP中使用C风格字符串的函数有:SnmpStrToEntity、SnmpEntityToStr、SnmpStrToOid、SnmpOidToStr。C风格字符串的内存分配、管理和释放完全由应用程序负责。因此我们还需要传递“size”参数给使用它的函数。,WinSnmp 几个重要的概念,二种数据结构 typedef struct smiUINT32 len;/number of array/elements smiLPUINT32 ptr;/pointer to an array/of subidentifiers smiOID,*smiLPOID;有两个类型,第一个用来指定他有多少个数字,第二个则指向一个一维数组,举个例子,如果一个对象标志符是,那么len应该为8,ptr应该指向一个数组,该数组的元素由1,3,6,1,2,1,1,1组成.,WinSnmp 几个重要的概念,typedef struct/smiVALUE portion of VarBind smiUINT32 syntax;/Insert SNMP_SYNTAX_ union smiINT sNumber;/SNMP_SYNTAX_INT/SNMP_SYNTAX_INT32 smiUINT32 uNumber;/SNMP_SYNTAX_UINT32/SNMP_SYNTAX_CNTR32/SNMP_SYNTAX_GAUGE32/SNMP_SYNTAX_TIMETICKS smiCNTR64 hNumber;/SNMP_SYNTAX_CNTR64 smiOCTETS string;/SNMP_SYNTAX_OCTETS/SNMP_SYNTAX_BITS/SNMP_SYNTAX_OPAQUE/SNMP_SYNTAX_IPADDR/SNMP_SYNTAX_NSAPADDR smiOID oid;/SNMP_SYNTAX_OID smiBYTE empty;/SNMP_SYNTAX_NULL/SNMP_SYNTAX_NOSUCHOBJECT/SNMP_SYNTAX_NOSUCHINSTANCE/SNMP_SYNTAX_ENDOFMIBVIEW value;/union smiVALUE,*smiLPVALUE;,WinSnmp 几个重要的概念,该结构有两个类型构成,一个是smiUINT32 syntax;另一个看上去挺复杂,是一个共同体类型.当get的数据返回时syntax表明了返回数据的类型,而在共同体中的相应类型的变量中存储了我们所要求的值。,WinSnmp 几个重要的概念,内存的释放WinSNMP应用程序必须负责释放所有通过调用WinSNMP API函数所分配的资源,主要有以下三类函数:SnmpFree:释放Entity、Context、Pdu、Vbl、Descriptor SnmpClose:关闭会话 SnmpCleanup:必须在程序结束之前调用,释放所有资源应用程序推荐使用上述的顺序来释放所有的WinSNMP资源。,WinSnmp 编程概要,和其他编程过程一样,整个SNMP编程也是经过一个创建,执行,销毁的过程,初始化SNMP环境即加载SNMP的功能,接着就要执行所进行的操作,SNMP是基于消息机制的,所以消息传递与管理是我们在编程中所必须注意的问题,最后要进行销毁和回收资源,这一点我们必须注意,因为如果不销毁这些资源系统将不会自动回收这些资源,将会导致资源无法释放而挂起。,WinSnmp编程基本步骤,初始化SNMP环境(设置传输模式,重传方案和延时)创建会话 创建变量绑定表和PDU 传输数据 接收数据 释放资源,WinSnmp常用函数介绍,初始化SNMP,用到的函数是SnmpStartup(smiLPUINT32 nMajorVersion,smiLPUINT32 nMinorVersion,smiLPUINT32 nLevel,smiLPUINT32 nTranslateMode,smiLPUINT32 nRetransmitMode);五个参数作为接收参数返回SNMP的主版本号,副版本号,支持最高的操作标准,默认的实体/上下文传输模式,默认的重发机制。,WinSnmp常用函数介绍,设置传输模式,用到的函数是SNMPAPI_STATUS SnmpSetTranslateMode(smiUINT32 nTranslateMode/new entity/context translation mode);该函数只有一个参数,有以下几种选择:SNMPAPI_TRANSLATED 不常用 SNMPAPI_UNTRANSLATED_V1 版本V1 SNMPAPI_UNTRANSLATED_V2 版本V2 你可以选择任一个参数,第二和第三个参数其区别是在版本一中get_bulk的操作不被允许,因为版本一不支持这种操作.,WinSnmp常用函数介绍,设置重传模式,用到的函数是SNMPAPI_STATUS SnmpSetRetransmitMode(smiUINT32 nRetransmitMode/new retransmission mode);该函数只有一个参数,有以下两种选择 SNMPAPI_ON 启动重传模式 SNMPAPI_OFF 关闭重传模式,WinSnmp常用函数介绍,设置重传次数,用到的函数是 SNMPAPI_STATUS SnmpSetRetry(SNMP_ENTITY hEntity,/destination management entity smiUINT32 nPolicyRetry/new retry count value for database);该函数的第一个参数是代理或者管理站实体句炳,通常我们设置目标实体的重传次数,也就是接收消息的网络设备的实体。第二个参数是重传次数。,WinSnmp常用函数介绍,设置超时时间,用到的函数是SNMPAPI_STATUS SnmpSetTimeout(HSNMP_ENTITY hEntity,/destination management entity smiTIMETICKS nPolicyTimeout/new time-out value for database);该函数的第一个参数是代理或者管理站的实体句炳,通常我们设置目标实体的超时时间,也就是接收消息的网络设备的实体。第二个参数是超时的时间,计量单位是百分之一秒。,WinSnmp常用函数介绍,建立会话,用到的函数有两个 第一个函数是仅针对于有窗体的应用 HSNMP_SESSION SnmpOpen(HWND hWnd,UINT wMsg);第一个参数是你所要接收Snmp代理消息的窗体句柄,第二个参数是当有消息到来时所要触发的Windows消息。这个函数成功返回后就返回一个会话句柄。一般我们创建一个自定义消息然后为此自定义消息创建一个响应函数,在此函数中我们接收到来的消息。,WinSnmp常用函数介绍,第二个创建会话句柄的函数 HSNMP_SESSION SnmpCreateSession(HWND hWnd,UINT wMsg,SNMPAPI_CALLBACK pfnCallBack,LPVOID lpClientData)此函数是为在非窗体应用时提供的,也可以作为窗体应用时的创建会话函数。第一个和第二个参数和SnmpOpen的参数一样(可以为NULL)。第三个参数是我们要接收消息的回调函数,第四个参数是用户自定义的要传给此回调函数的数据。,WinSnmp常用函数介绍,回调函数原型 SNMPAPI_STATUS CALLBACK SNMPAPI_CALLBACK(HSNMP_SESSION hSession,HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData);第一个参数hSession是我们要接收的会话句柄,第二个,第三个和最后一个参数和创建函数的含义一样。参数wParam为0时表示有数据到来,此时我们就可以接收数据了。当非0时说明是一个代理的一个异步消息触发,具体的含义lParam会给出。,WinSnmp常用函数介绍,创建实体,用到的函数是HSNMP_ENTITY SnmpStrToEntity(HSNMP_SESSION session,LPCSTR string/pointer to a string that identifies/the entity);该函数的第一个参数是创建会话函数返回的会话句炳,第二个参数与设置的传输模式有关,如果选则后两个参数,那么这里的string就是要发送消息的网络设备ip地址或接收消息的管理设备ip地址。根据自己的需要,通常我们将这两个实体都创建一下。该函数返回一个实体句炳。,WinSnmp常用函数介绍,创建上下文句炳,用到的函数是 HSNMP_CONTEXT SnmpStrToContext(HSNMP_SESSION session,smiLPCOCTETS string/pointer to a string structure);该函数的第一个参数是会话句炳,第二个参数与设置的传输模式有关,如果选则后两个参数,那么这里的string就是共同体名。该函数返回一个上下文句炳。,WinSnmp常用函数介绍,创建变量捆绑列表,用到的函数是 HSNMP_VBL SnmpCreateVbl(HSNMP_SESSION session,smiLPCOID name,/pointer to the variable name smiLPCVALUE value/pointer to the value to associate/with the variable);第二个参数代表一个需要访问的代理Mib中的一个节点标识,第三个参数是需要返回值的类型。在此函数中这两个参数可以为空。如果不为空则将这两个参数设置为变量绑定表的头部。返回值是一个变量绑定表句柄。,WinSnmp常用函数介绍,WinSnmp常用函数介绍,当我们要给刚才创建的变量绑定表里面追加内容时用如下函数:SNMPAPI_STATUS SnmpSetVb(HSNMP_VBL vbl,smiUINT32 index,smiLPCOID name,smiLPCVALUE value);index是要追加地址的索引,如果为0就直接在后面追加,当大于0时就用后两个参数设置此位置。后两个参数我们前面已经提过了。,WinSnmp常用函数介绍,创建完成变量绑定表后我们就可以用这个变量绑定句柄来创建PDU了。HSNMP_PDU SnmpCreatePdu(HSNMP_SESSION session,smiINT PDU_type,smiINT32 request_id,smiINT error_status,smiINT error_index,HSNMP_VBL varbindlist);第一个参数是会话句柄。,WinSnmp常用函数介绍,第二个参数表示我们要执行的操作方式,有以下几种类型:SNMP_PDU_GET SNMP_PDU_GETNEXT SNMP_PDU_RESPONSE SNMP_PDU_SET SNMP_PDU_GETBULK SNMP_PDU_V1TRAP SNMP_PDU_TRAP,WinSnmp常用函数介绍,SNMP_PDU_GET通常用来获得某一个特定的对象标志符所对应的值,SNMP_PDU_GETNEXT是在编程人员不了解该表列情况下使用的用来获取一组值的操作。SNMP_PDU_RESPONSE一般是SNMP代理填写的,表示应答发出操作请求的数据报。SNMP_PDU_SET是用来改变某一对象标志符的值的操作。SNMP_PDU_GETBULK只能在V2版本以上使用,是用来解决SNMP_PDU_GETNEXT一次消息只能取得一个数据的缺点,可通过发一次消息取得一组数据。SNMP_PDU_V1TRAP和SNMP_PDU_TRAP使用来发自陷消息的操作。,WinSnmp常用函数介绍,第三个参数request_id,对于同步实现消息机制的编程来说,几乎没有作用,但是对于异步操作,该参数有很重要的作用,你可以用它来标志某一个请求的消息,如果有几个消息都在消息队列中,你可以通过它来确定自己想要处理的消息,该值完全可以自己来设定。error_status和error_index在SNMP_PDU_GETBULK操作中分别为PDU中non_repeaters域定一个值和PDU的max_repetitions域指定一个值。在其他操作中都为0。该函数返回一个PDU句炳。,WinSnmp常用函数介绍,现在我们创建完成了PDU,接下来就是发送此PDU了。发送用如下函数:SNMPAPI_STATUS SnmpSendMsg(HSNMP_SESSION session,HSNMP_ENTITY srcEntity,HSNMP_ENTITY dstEntity,HSNMP_CONTEXT context,HSNMP_PDU PDU);可以看出上面的参数都是我们前面创建过的。,WinSnmp常用函数介绍,以上都是我们发送PDU常用的一些函数,在此整理一下此过程如下:1.加载SNMP,2.建立会话,3.设置传输模式,4.创建实体,5.设置重传模式,6.设置超时时间,7.设置重传次数,8.创建上下文句炳,9.创建变量捆绑列表,10.追加绑定列表,11.创建PDU,12.发送消息。,WinSnmp常用函数介绍,接收消息函数SNMPAPI_STATUS SnmpRecvMsg(HSNMP_SESSION session,LPHSNMP_ENTITY srcEntity,LPHSNMP_ENTITY dstEntity,LPHSNMP_CONTEXT context,LPHSNMP_PDU PDU);这个函数的参数和发送函数的参数是一样的,但是除了第一个参数是输入参数以外其它参数都是输出参数,我们只用接收就行了。,WinSnmp常用函数介绍,接收到PUD以后我们就可以从PDU中得到变量绑定表了,使用函数:SNMPAPI_STATUS SnmpGetPduData(HSNMP_PDU PDU,smiLPINT PDU_type,smiLPINT32 request_id,smiLPINT error_status,smiLPINT error_index,LPHSNMP_VBL varbindlist);,WinSnmp常用函数介绍,只有第一个参数是需要你输入的,而这已经通过SnmpRecvMsg得到了,其他的参数都是需要接收的,如果你用异步接收的话,request_id可以标识发送的消息。还有error_status和error_index,用在SNMP_PDU_GETBULK操作中,他们的意义是不同的,除此之外,他们用来接收SNMP端返回的错误消息,如果返回全都是0,那就是正确返回了。,WinSnmp常用函数介绍,计算返回列表数目,用函数SNMPAPI_STATUS SnmpCountVbl(HSNMP_VBL vbl);将上一步得到的varbindlist代到里面去就行了,他的返回只是一个整型,是你所得到的变量绑定列表返回的变量数。,WinSnmp常用函数介绍,得到变量绑定表后我们就可以接收数据了,使用如下函数:SNMPAPI_STATUS SnmpGetVb(HSNMP_VBL vbl,smiUINT32 index,smiLPOID name,smiLPVALUE value)我们可以根据我们得到的变量绑定表中的数据个数来建立一个循环得到数据。,WinSnmp常用函数介绍,以上创建的资源我们必须逐一的释放,每种句柄都有各自对应的释放函数:如SnmpFreeEntity,SnmpFreeContext,SnmpFreeVbl,SnmpFreePdu,SnmpClose,他们的参数只有一个,就是你要是放得句炳。最后要清理整个现场,用函数SnmpCleanup()。,WinSnmp常用函数介绍,当需要接收Trap时我们可以使用函数:SNMPAPI_STATUS SnmpRegister(HSNMP_SESSION session,HSNMP_ENTITY srcEntity,HSNMP_ENTITY dstEntity,HSNMP_CONTEXT context,smiLPCOID notification,smiUINT32 state);,WinSnmp常用函数介绍,参数notification一般设置为NULL表示我们可以接收所有的Trap消息,最后一个参数是SNMPAPI_ON时表示接收Trap或者是SNMPAPI_OFF时表示拒绝接收Trap。用这个函数注册完毕后,我们就可以在回调函数中接收Trap消息了。接收过程和我们接收一般的Get数据是一样的。到此为止我们已经见过了基本的WinSnmp程序设计所要接触的函数。,WinSnmp其它问题,GETNEXT操作的实现:GETNEXT主要是遍历表格变量时所使用的PDU类型,要使用它主要有两个问题:1.如何判断结束。2.如何处理响应消息。我们的解决方法是在接收消息函数中我们得到当前接收到的Oid,然后用此Oid来修改我们的变量绑定表,再把此修改过的PDU发送出去我们就可以陆续的遍历表项了。判断结束我们也放在接收函数中,如果当前的Oid已经超过了我们要接收的Oid范围则遍历停止。,结束,