您好,欢迎访问三七文档
SNMP用VC++6.0实现的方法SNMP(SimpleNetworkManagementProtocol)是简单网络管理协议,主要用来管理网络设备,正因为“简单”,所以其发展很快,到目前为止几乎所有的网络产品都要为其提供支持,以方便管理员的管理和软件开发人员的开发。在这里我们不对有关SNMP的概念和基础知之作过多地阐述,一且假定你对其工作原理有了一定的了解,而仅缺的是如何去实现他。我们所阐述的是基于VC6.0下的SNMP编程。详细介绍一下有关SNMP编程的过程及API函数的用法,在遇到难于理解的部分,我会以较大的篇幅作以解释。言归正传,进入我们的主题。首先来阐述几个重要的概念:1。community(共同体名):如果翻译过来可能会显得难于理解,其实你完全可以把它理解为一个带有权限的登陆账户,这是你访问网络设备的重要凭据,比如你要访问交换机,假如交换机的community是public,其权限是只读的,那你一次用户登陆交换机就可以查看有关交换机记录的数据。如果其权限是读写的,你你就有权修改其中的一些设置,如封锁某一个交换机的端口。大部分交换机默认情况下,以public作为只读community,以private作为读写community。2。Oid(对象标志符):是以SMI(StructureofManagementInformation)管理信息结构为基础的一系列点分符号,如1.3.6.1.2.1.1.1,这些点分符号在任何网络设备中都唯一标识某一个数据参数。他们的集合我们称为MIB(ManagementInformationBase)管理信息库。对于他们所标识的意义,读者可以到网上查询一下,提供一个简单的寻找办法,你可以进入google,直接输入1.3.6.1.2.1.1等点分字符串。下面进入我们的正题。和其他编程过程一样,整个SNMP编程也要经过一个创建,执行,销毁的过程,通俗点说就是要做准备,初始化SNMP环境即加载SNMP的功能,接着就要执行所进行的操作,SNMP是基于消息机制的,所以消息传递与管理是我们在编程中所必须注意的问题,最后要进行销毁和回收资源,这一点相信编程人员都会注意到。以下我们按步骤给予详细介绍:1。加载SNMP,用到的函数是SnmpStartup(smiLPUINT32nMajorVersion,smiLPUINT32nMinorVersion,smiLPUINT32nLevel,smiLPUINT32nTranslateMode,smiLPUINT32nRetransmitMode);五个参数作为接收参数返回SNMP的主版本号,副版本号,支持最高的操作标准,默认的实体/上下文传输模式,默认的重发机制。2。建立会话,用到的函数是HSNMP_SESSIONSnmpOpen(HWNDhWnd,//handletothenotificationwindowUINTwMsg//windownotificationmessagenumber);或HSNMP_SESSIONSnmpCreateSession(HWNDhWnd,//handletothenotificationwindowUINTwMsg,//windownotificationmessagenumberSNMPAPI_CALLBACKpfnCallBack,//notificationcallbackfunctionLPVOIDlpClientData//pointertocallbackfunctiondata);第二个函数并没有被完全确定下来,他只是为程序员在编程过程中不是基于windows的编程提供一种选择,第一个参数指向接收消息的窗口句炳,第二个参数则指向该窗口需要接收的消息码。该函数返回一个会话句炳,这一句炳是在我们以下程序中都要用到的一个重要变量。3。设置传输模式,用到的函数是SNMPAPI_STATUSSnmpSetTranslateMode(smiUINT32nTranslateMode//newentity/contexttranslationmode);该函数只有一个参数,有以下几种选择:SNMPAPI_TRANSLATED不常用SNMPAPI_UNTRANSLATED_V1版本V1SNMPAPI_UNTRANSLATED_V2版本V2你可以选择任一个参数,我使用过第二和第三个参数,其区别是在版本一中get_bulk的操作不被允许,因为版本一不支持这种操作,其具体细节可查阅有关资料,推荐一本书《用SNMP管理互联网络》。至于第一个参数本人未作过试验,不能加以妄断。4。创建实体,用到的函数是HSNMP_ENTITYSnmpStrToEntity(HSNMP_SESSIONsession,//handletotheWinSNMPsessionLPCSTRstring//pointertoastringthatidentifies//theentity);该函数的第一个参数是第二步返回的会话句炳,第二个参数与你在第三步中设置的传输模式有关,如果你选则后两个参数,那么这里的string就是你要发送消息的网络设备ip地址或接收消息的管理设备ip地址。根据自己的需要,通常我们将这两个实体都创建一下。该函数返回一个实体句炳。5。设置重传模式,用到的函数是SNMPAPI_STATUSSnmpSetRetransmitMode(smiUINT32nRetransmitMode//newretransmissionmode);该函数只有一个参数,有以下两种选择SNMPAPI_ON启动重传模式SNMPAPI_OFF关闭重传模式6。设置超时时间,用到的函数是SNMPAPI_STATUSSnmpSetTimeout(HSNMP_ENTITYhEntity,//destinationmanagemententitysmiTIMETICKSnPolicyTimeout//newtime-outvaluefordatabase);该函数的第一个参数是第四步返回的实体句炳,通常我们设置目标实体的超时时间,也就是接收消息的网络设备的实体。第二个参数是超时的时间。7。设置重传次数,用到的函数是SNMPAPI_STATUSSnmpSetRetry(HSNMP_ENTITYhEntity,//destinationmanagemententitysmiUINT32nPolicyRetry//newretrycountvaluefordatabase);该函数的第一个参数是第四步返回的实体句炳,通常我们设置目标实体的重传次数,也就是接收消息的网络设备的实体。第二个参数是重传次数。8。创建上下文句炳,用到的函数是HSNMP_CONTEXTSnmpStrToContext(HSNMP_SESSIONsession,//handletotheWinSNMPsessionsmiLPCOCTETSstring//pointertoastringstructure);该函数的第一个参数是第二步返回的会话句炳,第二个参数与你在第三步中设置的传输模式有关,如果你选则后两个参数,那么这里的string就是共同体名。该函数返回一个上下文句炳。由此我们的到了三个重要的句炳,总结一下:1。会话句炳,2。实体句炳,3。上下文句炳,请记住这三个重要的句炳,因为它们在SNMP编程过程中时刻用到,只有在结束后才释放他们。9。创建变量捆绑列表,用到的函数是HSNMP_VBLSnmpCreateVbl(HSNMP_SESSIONsession,//handletotheWinSNMPsessionsmiLPCOIDname,//pointertothevariablenamesmiLPCVALUEvalue//pointertothevaluetoassociate//withthevariable);这是一个比较难理解的函数,要对其有深入的理解,你必须对SNMP的数据报格式有所了解,在这里我不能做过多地阐述,可以给你打个比方,好比一个专列火车,他只负责到目的地接人。开始的时候所有车厢是空的,每个车厢标有号码,标志其接的人的特征,好比第一车厢要接所有姓赵的人,第二节车厢要接局以上的领导,等等。车头由司机驱动着,他当然知道自己的目的地,一路几经周折,终于到达目的地,此时车上还未有一个人,目的地的站长首先要检查该司机的证件和文书,看看他有没有权利来接走这批人,如果没有,就会在第一个车厢内坐上一个本站的通知官,他的责任就是返回告诉源站长官说该司机没有权力接人。如果有,那么站长要看看各节车厢是否符合本站接人的要求,如果符合,就将不同的人送到不同的车厢就坐。如果有改姓的的请求,那么要看本站是否允许,如果允许,就将本站这些符合条件的人改姓。在这里我们可以把每节车厢看作是不同变量,车厢的空间是用来接收人的,那么具有不同特征的人就是返回数据。这种车厢与其空间就好比一个绑定,SNMP的数据报正如这种方式一次可以有多个绑定。而车厢号就好比对象标志符。当然只有第一个是特殊的,因为他要有车头,所以用SnmpCreateVbl函数,其他的绑定我们要用SnmpSetVb,将其依次连接到前一节车厢上。好了,由上述,我们可以知道了,该函数的第一个参数是第二步返回的会话句炳,而其他两个参数开始时就可以置为空了。该函数返回一个绑定列表句炳。10。追加绑定列表,用到的函数是SNMPAPI_STATUSSnmpSetVb(HSNMP_VBLvbl,//handletothevariablebindingslistsmiUINT32index,//positionofthevariablebindingentry//inthelistsmiLPCOIDname,//pointertothevariablenameportion//oftheentrysmiLPCVALUEvalue//pointertothevariablevalueportion//oftheentry);我们可以看到这个函数的后两个参数与SnmpCreateVbl相同,也就是车厢与空间的绑定。第一个参数是HSNMP_VBL,一个绑定列表句炳,这也可以理解,因为我们已经创建了绑定列表,第二个参数是变量绑定索引,想一想,这么多节车厢,总的有个顺序吧,别忙,你会提出一个显而易见的问题,如果我只创建了头一个绑定列表,我想在向其追加其他的绑定列表,那么该索引值会有什么用呢?我完全可以顺序加进去啊。就像一个队列似的。完全正确!实际上该函数也是这样实现的,当我们要追加变量绑定时,我们须将该索引值置为0。该索引值只是在我们实现诸如set命令时才用到,这将在下文中叙述。一且进行得很顺利,不过如果你没有进行过SNMP编程的话,你会对其中两个结构感到迷惑,一个是smiLPCOID,还有就是smiLPCVALUE,别急,先看第一个结构,你会发现有一个英文组合你会很熟悉,因为我在前文介绍过他,就是smiLPCOID中的OID,对了,他的意思是对象标志符,LP如果你常用VC编程也会知道他多数是一个指针了。是了,他就是一个指向smiOID的指针类型。让我们看看他的内部构造:typedefstruct{smiUINT32len;//numberofarrayelementssmiLPUINT32ptr;//pointertoanarrayofsubidentifiers}smiOID,*smiLPOID;有两个类型,第一个用来指定他有多少个数字,第二个则指向一个一维数组,举个例子,如果一个对象标志符是1.3.6.1.2.1.1.1,那么len应该为8,ptr应该指向一个数组,该数组的元素由1,3,6,1,2,1,1,1组成,好像“.”没有了,正确,因为在SNMP中就要用到这样的结构,你会想,怎样才能构造这样一个结构呢?很简单,SNMP的API函数给我们提供了方便,你可以定义一个字符串如1.3.6.1.2.1.1.1,用SNMPAPI_STATUSSnmpStrToOid(LPCSTRst
本文标题:SNMP用VC开发
链接地址:https://www.777doc.com/doc-2859276 .html