SNMP用VC开发

发布时间 : 星期三 文章SNMP用VC开发更新完毕开始阅读

SNMP用VC++6.0实现的方法

SNMP(Simple Network Management Protocol)是简单网络管理协议,主要用来管理网络设备,正因为“简单”,所以其发展很快,到目前为止几乎所有的网络产品都要为其提供支持,以方便 管理员的管理和软件开发人员的开发。

在这里我们不对有关SNMP的概念和基础知之作过多地阐述,一且假定你对其工作原理有了一定的了解,而仅缺的是如何去实现他。

我们所阐述的是基于VC6.0下的SNMP编程。详细介绍一下有关SNMP编程的过程及API函数的用法,在遇到难于理解的部分,我会以较大的篇幅作以解释。言归正传,进入我们的主题。

首先来阐述几个重要的概念:

1。community (共同体名):如果翻译过来可能会显得难于理解,其实你完全可以把它理解为一个带有权限的登陆账户,这是你访问网络设备的重要凭据,比如你要访问交换机, 假如交换机的community是public,其权限是只读的,那你一次用户登陆交换机就可以查看有关交换机记录的数据。如果其权限是读写的,你你就有 权修改其中的一些设置,如封锁某一个交换机的端口。大部分交换机默认情况下,以public作为只读community,以private作为读写 community。

2。Oid(对象标志符):是以SMI(Structure of Management Information)管理信息结构为基础的一系列点分符号,如1.3.6.1.2.1.1.1,这些点分符号在任何网络设备中都唯一标识某一个数据参 数。他们的集合我们称为MIB(Management Information Base)管理信息库。对于他们所标识的意义,读者可以到网上查询一下,提供一个简单的寻找办法,你可以进入google,直接输入 1.3.6.1.2.1.1等点分字符串。 下面进入我们的正题。

和其他编程过程一样,整个SNMP编程也要经过一个创建,执行,销毁的过程,通俗点说就是要做准备,初始化SNMP环境即加载SNMP的功能, 接着就要执行所进行的操作,SNMP是基于消息机制的,所以消息传递与管理是我们在编程中所必须注意的问题,最后要进行销毁和回收资源,这一点相信编程人 员

都会注意到。以下我们按步骤给予详细介绍:

1。加载SNMP,用到的函数是SnmpStartup(smiLPUINT32 nMajorVersion, smiLPUINT32 nMinorVersion, smiLPUINT32 nLevel,

smiLPUINT32 nTranslateMode, smiLPUINT32 nRetransmitMode);

五个参数作为接收参数返回SNMP的主版本号,副版本号,支持最高的操作标准,默认的实体/上下文传输模式,默认的重发机制。

2。建立会话,用到的函数是HSNMP_SESSION SnmpOpen(

HWND hWnd, // handle to the notification window UINT wMsg // window notification message number );

或HSNMP_SESSION SnmpCreateSession(

HWND hWnd, // handle to the notification window

UINT wMsg, // window notification message number

SNMPAPI_CALLBACK pfnCallBack, // notification callback function LPVOID lpClientData // pointer to callback function data );

第二个函数并没有被完全确定下来,他只是为程序员在编程过程中不是基于windows的编程提供一种选择,第一个参数指向接收消息的窗口句 炳,第二个参数则指向该窗口需要接收的消息码。该函数返回一个会话句炳,这一句炳是在我们以下程序中都要用到的一个重要变量。

3。设置传输模式,用到的函数是SNMPAPI_STATUS SnmpSetTranslateMode( smiUINT32 nTranslateMode // new entity/context translation mode );

该函数只有一个参数,有以下几种选择: SNMPAPI_TRANSLATED 不常用

SNMPAPI_UNTRANSLATED_V1 版本V1

SNMPAPI_UNTRANSLATED_V2 版本V2

你可以选择任一个参数,我使用过第二和第三个参数,其区别是在版本一中get_bulk的操作不被允许,因为版本一不支持这种操作,其具体细节可查阅有关资料,推荐一本书《用SNMP管理互联网络》。至于第一个参数本人未作过试验,不能加以妄断。

4。创建实体,用到的函数是HSNMP_ENTITY SnmpStrToEntity(

HSNMP_SESSION session, // handle to the WinSNMP session LPCSTR string // pointer to a string that identifies // the entity

);

该函数的第一个参数是第二步返回的会话句炳,第二个参数与你在第三步中设置的传输模式有关,如果你选则后两个参数,那么这里的string就 是你要发送消息的网络设备ip地址或接收消息的管理设备ip地址。根据自己的需要,通常我们将这两个实体都创建一下。该函数返回一个实体句炳。

5。设置重传模式,用到的函数是SNMPAPI_STATUS SnmpSetRetransmitMode( smiUINT32 nRetransmitMode // new retransmission mode );

该函数只有一个参数,有以下两种选择 SNMPAPI_ON 启动重传模式 SNMPAPI_OFF 关闭重传模式

6。设置超时时间,用到的函数是SNMPAPI_STATUS SnmpSetTimeout(

HSNMP_ENTITY hEntity, // destination management entity smiTIMETICKS nPolicyTimeout // new time-out value for database );

该函数的第一个参数是第四步返回的实体句炳,通常我们设置目标实体的超时时间,也

就是接收消息的网络设备的实体。第二个参数是

超时的时间。

7。设置重传次数,用到的函数是SNMPAPI_STATUS SnmpSetRetry(

HSNMP_ENTITY hEntity, // destination management entity smiUINT32 nPolicyRetry // new retry count value for database );

该函数的第一个参数是第四步返回的实体句炳,通常我们设置目标实体的重传次数,也就是接收消息的网络设备的实体。第二个参数是 重传次数。

8。创建上下文句炳,用到的函数是HSNMP_CONTEXT SnmpStrToContext( HSNMP_SESSION session, // handle to the WinSNMP session smiLPCOCTETS string // pointer to a string structure

);

该函数的第一个参数是第二步返回的会话句炳,第二个参数与你在第三步中设置的传输模式有关,如果你选则后两个参数,那么这里的string就是共同体名。该函数返回一个上下文句炳。

由此我们的到了三个重要的句炳,总结一下:1。会话句炳,2。实体句炳,3。上下文句炳,请记住这三个重要的句炳,因为它们在SNMP编程过程中时刻用到,只有在结束后才释放他们。

9。创建变量捆绑列表,用到的函数是HSNMP_VBL SnmpCreateVbl(

HSNMP_SESSION session, // handle to the WinSNMP session smiLPCOID name, // pointer to the variable name smiLPCVALUE value // pointer to the value to associate

// with the variable );

这是一个比较难理解的函数,要对其有深入的理解,你必须对SNMP的数据报格式有所了解,在这里我不能做过多地阐述,可以给你打个比方,好比一 个专列火车,他只负责到目的地接人。开始的时候所有车厢是空的,每个车厢标有号码,标志其接的人的特征,好比第一车厢要接所有姓赵的人,第二节车厢要接局 以上的领导,等等。车头由司机驱动着,他当然知道自己的目的地,一路几经周折,终于到达目的地,此时车上还未有一个人,目的地的站长首先要检查该司机的证 件和文书,看看他有没有权利来接走这批人,如果没有,就会在第一个车厢内坐上一个本站的通知官,他的责任就是返回告诉源站长官说该司机没有权力接人。如果 有,那么站长要看看各节车厢是否符合本站接人的要求,如果符合,就将不同的人送到不同的车厢就坐。如果有改姓的的请求,那么要看本站是否允许,如果允许, 就将本站这些符合条件的人改姓。

在这里我们可以把每节车厢看作是不同变量,车厢的空间是用来接收人的,那么具有不同特征的人就是返回数据。这种车厢与其空间就好比一个绑定, SNMP的数据报正如这种方式一次可以有多个绑定。而车厢号就好比对象标志符。当然只有第一个是特殊的,因为他要有车头,所以用 SnmpCreateVbl函数,其他的绑定我们要用SnmpSetVb,将其依次连接到前一节车厢上。

好了,由上述,我们可以知道了,该函数的第一个参数是第二步返回的会话句炳,而其他两个参数开始时就可以置为空了。该函数返回一个绑定列表句炳。

10。追加绑定列表,用到的函数是SNMPAPI_STATUS SnmpSetVb(

HSNMP_VBL vbl, // handle to the variable bindings list smiUINT32 index, // position of the variable binding entry // in the list

smiLPCOID name, // pointer to the variable name portion // of the entry

smiLPCVALUE value // pointer to the variable value portion // of the entry );

我们可以看到这个函数的后两个参数与SnmpCreateVbl相同,也就是车厢与空间的绑定。第一个参数是HSNMP_VBL,一个绑定列表 句炳,这也可以理解,因为我们已经创建了绑定列表,第二个参数是变量绑定索引,想一想,这么多节车厢,总的有个顺序吧,别忙,你会提出一个显而易见的问 题,如果我只创建了头一个绑定列表,我想在向其追加其他的绑定列表,那么该索引值会有什么用呢?我完全可以顺序加进去啊。就像一个队列似的。完全正确!实 际上该函数也是这样实现的,当我们要追加变量绑定时,我们须将该索引值置为0。该索引值只是在我们实现诸如set命令时才用到,这将在下文中叙述。

一且进行得很顺利,不过如果你没有进行过SNMP编程的话,你会对其中两个结构感到迷惑,一个是smiLPCOID,还有就是 smiLPCVALUE,别急,先看第一个结构,你会发现有一个英文组合你会很熟悉,因为我在前文介绍过他,就是smiLPCOID中的OID,对了,他 的意思是对象标志符,LP如果你常用VC编程也会知道他多数是一个指针了。是了,他就是一个指向smiOID的指针类型。让我们看看他的内部构造: typedef struct {

smiUINT32 len; // number of array elements

smiLPUINT32 ptr; // pointer to an array of subidentifiers

} smiOID, *smiLPOID; 有两个类型,第一个用来指定他有多少个数字,第二个则指向一个一维数组,举个例子,如果一个对象标志符是1.3.6.1.2.1.1.1,那么

len应该为8,ptr应该指向一个数组,该数组的元素由1,3,6,1,2,1,1,1组成,好像“.”没有了,正确,因为在SNMP中就要用到这样的 结构,你会想,怎样才能构造这样一个结构呢?很简单,SNMP的API函数给我们提供了方便,你可以定义一个字符串如 \用

SNMPAPI_STATUS SnmpStrToOid(

LPCSTR string, // string object identifier to convert smiLPOID dstOID // object identifier internal representation

);函数来进行转换,看看其中两个参数,是不是很吻合的对应啊。当然,这种转换时可逆的,你可以用SnmpOidToStr来进行,具体可以查一下MSDN。

下面讲一讲smiLPCVALUE,由上面的推理,你一定可以得出他是一个指向smiVALUE的指针类型。让我们来看看smiVALUE结构,这个结构比较复杂,我试图讲得清楚一些。 typedef struct { // smiVALUE portion of VarBind smiUINT32 syntax; // Insert SNMP_SYNTAX_ union {

联系合同范文客服:xxxxx#qq.com(#替换为@)