Download presentation
Presentation is loading. Please wait.
1
计算机网络管理 -第6章 Windows和SNMP
2
第6章 Windows和SNMP 6.1 Windows SNMP服务的基本概念 6.2 SNMP应用程序接口 6.3 扩展代理的实现
6.4 陷入的实现 6.5 SNMP管理应用程序接口 6.6 网络管理应用程序设计
3
SNMP在90年代初刚刚开始应用,那是Windows 3.0/3.1/3.2是16位操作系统,微软还没有制定16位的网络管理标准;
Windows NT操作系统出现后,微软制定了远程过程调用和系统管理服务(SMS)标准,作为公司专用的网络管理平台. 由于SNMP在TCP/IP网络上广泛应用,微软推出TCP/IP 32位协议簇时包含了一个SNMP选件,可以安装在NT的服务器和工作站上,接收和发送SNMP请求/响应/陷入等. 本章从windows中的SNMP服务的安装/测试/应用开发方面进行介绍.
4
6.1 Windows SNMP服务的基本概念 6.1.1 Windows 的SNMP服务
Windows NT是SNMP理想的开发平台,它支持SNMP V1管理站和代理功能,包括发送和接收陷入的功能. SNMP服务完全集成在windows NT系统中,是NT软件包的一部分.(在安装NT时可选装) Windows 95/98只支持SNMP的代理功能,不支持管理站的功能.(Windows95/98是被管的对象) 服务的概念:是一种特殊的32位应用软件,它通过win32 API与Windows NT的服务控制管理器(SCM)接口,一般后台运行;它作用是监视硬件设备和其它的系统进程,提供访问外围设备和操作系统辅助功能的能力.(系统服务在系统启动或用户登录时可以自动运行,用户退出或系统关机停止运行.) Windows SNMP的服务包括:SNMP代理服务程序snmp.exe和SNMP陷入服务程序SNMPTRAP.EXE; snmp.exe:接收SNMP请求报文,根据要求发送响应报文,能对SNMP报文进行语法分析,ASN.1和BER编码/译码 SNMPtrap.exe:监听发送给NT主机的陷入报文,然后把其中的数据传送给SNMP管理API.(windows 95/98没有陷入服务)
5
Winsock 控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。 如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。 建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。
6
SNMP服务和扩展代理 WinSock API 扩展代理DLL SNMP代理服务(SNMP.EXE)
SNMP陷入服务(SNMPTRP.EXE) UDP Port 162 UDP Port 161 SNMP Request SNMP Response SNMP Trap 扩展代理:SNMP代理服务是可扩展,允许动态地加入和减少MIB信息(程序员不必修改和重编译代理程序,只要添加和删除子代理就可以,该子代理称扩展代理,它能处理私有的MIB对象和特定的陷入条件:当SNMP代理服务接收到一个请求报文时,它就把变量绑定表的有关内容送给对应的扩展代理。扩展代理根据SNMP的规则对其私有的变量进行处理,形成响应信息)
7
SNMP代理服务与SNMP API的交互作用
SNMP API:是Microsoft为SNMP协议开发的应用程序接口,是一组用于构造SNMP服务,扩展服务和SNMP管理系统的库函数。上图表示了SNMP代理与SNMP API交互作用的过程。SNMP报文通过UDP/IP服务经WinSock API传送到SNMP代理,SNMP代理对报文译码,并进行认证检查,这个过程通过SNMP API(SNMPAPI.DLL交互作用,然后把变量绑定表的内容传送到有关扩展代理,经扩展代理处理形成响应信息又送回SNMP代理,再由SNMP代理装配成GetResponse报文,交给WinSock API送回发送请求的管理站) SNMP API(SNMPAPI..DLL) 扩展代理(MIB-2) 扩展代理(LAN Manager) 扩展代理(Microsoft WINS) SNMP 代理服务(SNMP.EXE) Winsock API GetRequest GetNextRequest SetRequest GetResponse Trap
8
SNMP 管理API(MGNTAPI.DLL)
SNMP陷入服务与SNMP API的交互作用 SNMP 陷入:陷入服务监视从WinSock API传来的陷入报文,然后把陷入数据通过命名的管道传送给SNMP的管理API(MGNTAPI.DLL)。管理API是Microsoft为开发SNMP管理应用提供动态连接库,是SNMP API的一部分。管理应用程序从管理API接收数据,向API发送管理信息,并通过管理API与WinSock通信,实现网络的管理。 SNMP API(SNMPAPI..DLL) SNMP 管理应用 SNMP陷入服务 (SNMPREAP.EXE) SNMP 管理API(MGNTAPI.DLL) Winsock API GetRequest GetNextRequest SetRequest GetResponset Trap
9
安装SNMP服务象安装Windows NT其它服务一样,唯一要注意的是,它必须先‘安装TCP/IP协议。
文件 解释 INETMIB1.DLL 实现MIB-2( )扩展代理 LMMIB2.DLL 实现LAN Manager MIB-2的扩展代理 MGMTAPI.DLL SNMP管理API MIB.BIN 经过编译的MIB数据,由管理API使用 SNMP.EXE SNMP代理服务可执行程序 SNMPTRAP.EXE SNMP陷入服务可执行程序 可安装的SNMP文件
10
文件 解释 WINS.MIB 实现WINS服务MIB( )的扩展代理 WINSMIB.DLL DHECMIB.DDL 实现DHEC服务MIB( )的扩展代理 DHEC.MIB INETSRV.MIB Microsoft IIS MIB( ) FTP.MIB Microsoft IIS FTP 服务器MIB( ) HTTP.MIB Microsoft IIS HTTP服务器 MIB( ) Internet 信息服务 (IIS) 是 Web 服务,它使得在 Intranet 或 Internet 上发布信息很容易 GOPHERD.MIB Microsoft IIS Gopher服务器 MIB( ) Microsoft的有关MIB模块 “Windows Internet 名称服务 (WINS)”:提供了动态复制数据库服务,此服务可以将 NetBIOS 名称注册并解析为网络上使用的 IP 地址。它启用服务器计算机来充当 NetBIOS 名称服务器并注册和解析网络上启用 WINS 客户的名称,就像 TCP/IP 上的 NetBIOS 标准中描述的一样 动态主机配置协议 (DHCP) :是一种 TCP/IP 标准,旨在通过服务器计算机来集中管理网络上使用的 IP 地址和其他相关配置详细信息,以减少管理地址配置的复杂性。提供了 DHCP 服务,它允许服务器计算机履行 DHCP 服务器的职责并且如 DHCP 草案标准 RFC 2131 中所述在您的网络上配置启用 DHCP 的客户机
11
SNMP在Windows NT中的安装和配置:
[1]安装: 1)登录到具有授权安装的帐户 2)双击控制面板的网络图标 3)点击服务 4)点击添加 5)点击网络服务队列中的SNMP服务选项 6)确定开始安装(一般安装完毕,重新安装windows NT的SP4以上版本) [2]配置: 1)SNMP服务的属性中的代理:包含变量sysContact(联系人)、sysLocation(位置)、sysServices(服务) 2)陷入:最多可以设置5个网络地址(IP地址,或IPX或DNS主机名) 3)陷入报文的团体名:区分大小写,是为了发送需要认证的陷入报文用,如果不设置,则任何的团体名都是有效的.如果要使代理只接收某些特定的管理主机发来的陷入,则可以在“安全性”中键入对应主机地址。
12
SNMP在Windows Windows9X中的安装和配置:
[2]策略编辑器的安装 [3]SNMP的配置: [4]修改注册表: [5]安装扩展代理DLL [6]测试SNMP服务
13
6.2 SNMP应用程序接口 [1]SNMP应用程序接口SNMP API由4部分组成: 扩展API 管理API 实用程序API 服务API
在编写扩展API代理和SNMP管理应用程序都使用这些函数。 [2]常用几个数据类型(在SNMP头文件SNMP.H中定义) Typedef struct{ BYTE *stream; //字节流指针 UINT length; //字节数 BOOL dynamic //如果动态分配存储器则为“true” } AsnOctetString
14
Typedef struct{ UNIT idlength //在oid中的整数个数 UINT ids; //指向整数流的指针 } AsnObjectIdentifier BYTE asnType union{ AsnInteger number; AsnOctetString String; ASnObjectIdentifier Object; AsnSequence sequence; AsnIpAddress Address AsnCounter Counter; AsnCauge gauge; AsnTimeticks ticks; AsnOpaque arbitrary; //(未知类) } } AsnAny
15
Typedef struct vb{ AsnObjectName name; AsnObjectSyntax value; } RFC1157VarBind Typedef struct{ RFC1157VarBind *list; UINT len; } RFC1157VarBindList
16
6.2.1 扩展API的概念 扩展API是4个函数的集合。SNMP服务和扩展代理DLL使用这些函数交换数据。这些函数的原型在SNMP.H头文件中,函数代码用在每个扩展代理中。 函数 用途 SnmpExtensionInit 实现扩展代理初始化和MIB对象注册 SnmpExtensionInitEx 提供多个MIB对象注册 SnmpExtensionQuery 处理Get,GetNext,Set请求 SnmpExtensionTrap 从扩展代理收集Trap数据
17
1)SnmpExtensionInit原型:
BOOL WINAPI SnmpExtensionInit( DWORD dwTimeZeroReference, //扩展代理存储的时间(白分之一秒) HANDLE *phPollForTrapEvent, //扩展代理发送Trap时获取的事件句柄 AsnObjectIdentifier *pSupportedView; //MIB子树的对象标识符 ) 2)SnmpExtensionInitEx原型: BOOL WINAPI SnmpExtensionInitEx( 3) SnmpExtensionQuery原型: BOOL WINAPI SnmpExtensionQuery( BYTE nRequestType, //Get 160,GetNext 161,Set 163 RFC1157VarBindList *pVariableBinding, //变量绑定表指针 AsnInteger *pnErrorStatus , //tooBig 1,noSuchName 2,badValue 3, //readOnly 4,genErr 5 AsnInteger *pnErrorIndex;)
18
4) SnmpExtensionTrap原型:
BOOL WINAPI SnmpExtensionTrap( AsnObjectIdentifier *penterprise, AsnInteger *pdwGenericTrap,//coldStart 1,warmStart 1,... AsnIngeter *pdwSpecificTrap, AsnTimeticks *pdwtimeStamp, RFC1157VarBindList *pVaribleBindings;)
19
管理API(MGMTAPI.DLL)是7个函数的集合。管理应用程序调用这些函数发送请求,接收响应 和陷入。
把OBJECT IDENTIFIER转换成AsnObjectIdentifier SnmpMgrStrToOid 把AsnObjectIdentifier转换成OBJECT IDENTIFIER SnmpMgrOidToStr 接收代理发来的Trap数据 SnmpMgrGetTrap 注册接收Trap的管理应用 SnmpMgrTrapListen 向代理发送Get,GetNext和Set请求 SnmpMgrRequest 关闭到代理的管套 SnmpMgrClose 打开到代理的管套 SnmpMgrOpen 用途 函数
20
Microsoft SNMP管理API有一定的局限性:
1)只能运行在Win32操作系统。 2)陷入操作调用命名管道服务,而Windows 95/98不支持命名管道,因此不能支持陷入服务。 3)发出请求和接收响应都调用SnmpMgrRequest,而SnmpMgrRequest函数是同步操作。不支持异步操作。 4)只能使用C,C++,因为两个头文件SNMP.H和MGMTAPI.H的很多数据类型是 AsnAny(包含大量的union的结构),所以大量使用指针。Java和 VB很难胜任。
21
6.2.3 实用程序API 实用API包含14个函数,分为存储器分配和数据管理两个组,函数原型在SNMP.H中,函数代码在SNMPAPI.DLL和SNMPAPI.LIB中。 函数 用途 SnmpUtilMenAlloc 分配内存 SnmpUtilMenREAlloc 重新分配内存 SnmpUtilMenFree 释放内存 SnmpUtilOidAppend 把两个对象放在一起 SnmpUtilOilCmp 比较两个AsnObjectIdentifier对象的值 SnmpUtilOidNCmp 比较两个AsnObjectIdentifier对象的前N个值 SnmpUtilOidCpy 拷贝一个AsnObjectIdentifier对象 SnmpUtilOidFree 释放AsnObjectIdentifier对象分配的存储器 SnmpUtilVarBindCpy 拷贝一个RFC1157VarBind对象 SnmpUtilVarBindFree 释放RFC1157VarBind对象动态分配的存储器 SnmpUtilVarBindListCpy 拷贝一个RFC1157VarBindList对象 SnmpUtilVarBindListFree 释放RFC1157VarBindList对象动态分配的存储器 SnmpUtilDbgPrint 在LOG文件中写入Debug消息 SnmpUtilPrintAsnAny 在标准打印机存储在AsnAny对象中的值
22
[1]存储器分配函数 注意: 1)SnmpUtilMen* 函数为SNMP应用和管理API分配和回收存储器。 2)扩展代理不能调用Win32的存储管理(LocalAlloc或GlobalAllo),也不能调用(编译支持)标准的C的存储管理(malloc,remalloc,free). 3)为了防止存储器泄漏(由于分配在不同的堆中而不能释放),要求所有的动态的对象都使用SnmpUtilMen*分配在同一存储堆中。 4)这些函数的参数和返回值与标准的C的存储管理函数(malloc,remalloc,free)相同,即返回的是指针而不是存储句柄。
23
1)SnmpUtilMenAlloc:该函数的作用是分配内存。 例子:为一个字节串os分配内存的。 AsnOctetString os;
3个函数: 1)SnmpUtilMenAlloc:该函数的作用是分配内存。 例子:为一个字节串os分配内存的。 AsnOctetString os; char szString[]=“An Octet String”; os.Length=lstrlen(szString); os.stream=(BYTE*)SnmpUtilMenAlloc(sizeof(BYTE)*os.Length); if(os.stream) mencpy(os.stream.szString,os.Length); 2)SnmpUtilMenReAlloc:重新分配内存,即改变以前分配的存储对象的大小。该函数有两个参数:一个指针指向已有的存储对象;另一个参数表示存储对象的新的字节数。 如:如果字节数增加,则分配存储器,反之如果字节数减少,则收回一部分存储器。重新分配成功时,返回新存储的对象指针,否则返回NULL。 SnmpUtilMenReAlloc(VarBinds.list,sizeof(RFC1157VarBind) *VarBinds.len);
24
3)SnmpUtilMenFree:这个函数的作用是释放内存。
例子: AsnOctetString os; os.Length=10; os.stream=(BYTE*)SnmpUtilMenAlloc(sizeof(BYTE)*os.Length); if(os.stream) { SnmpUtilMenFree(os.stream); os.stream=(BYTE*)NULL }
25
[2]数据管理函数 1)SnmpUtilOidAppend:把两个对象放在一起。 SNMPAPI SNMP_FUNC_TYPE SnmpUtilOidAppend( AsnObjectIdentifier * pOidDst, //目标对象 AsnObjectIdentifier * pOidSrc //加到目标对象的源对象 ); 2) SnmpUtilOidCmp比较两个AsnObjectIdentifier对象值 SnmpUtilOidCmp( AsnObjectIdentifier * pOid1, AsnObjectIdentifier * pOid2
26
3) SnmpUtilOidNCmp比较两个AsnObjectIdentifier对象值前N子标识符
SNMPAPI SNMP_FUNC_TYPE SnmpUtilOidNCmp( AsnObjectIdentifier * pOid1, AsnObjectIdentifier * pOid2, UINT nSubIds //需要比较的子标识符个数 ); 4)SnmpUtilOidCpy:拷贝一个AsnObjectIdentifier对象,源拷贝到目标 SnmpUtilOidNCpy( AsnObjectIdentifier * pDstObjId, AsnObjectIdentifier * pSrcObjId);
27
5) SnmpUtilOidFree:释放为AsnObjectIdentifier对象动态分配的存储器。
VOID SNMP_FUNC_TYPE SnmpUtilOidFree( AsnObjectIdentifier * pOid ); 6) SnmpUtilVarBindCpy:拷贝一个SnmpVarBind对象。 SNMPAPI SnmpUtilVarBindCpy( SnmpVarBind * pVbDst, SnmpVarBind * pVbSrc 7)SnmpUtilVarBindFre:释放为SnmpVarBind对象动态分配的存储器 SnmpUtilVarBindFree( SnmpVarBind * pVb
28
8) SnmpUtilVarBindListCpy:拷贝SnmpVarBindList对象
SNMPAPI SNMP_FUNC_TYPE SnmpUtilVarBindListCpy( SnmpVarBindList * pVblDst, SnmpVarBindList * pVblSrc ); 9) SnmpUtilVarBindListFree:释放为SnmpVarBindList对象动态分配的存储器 VOID SnmpUtilVarBindListFree( SnmpVarBindList * pVbl
29
10)SnmpUtilDbgPrint:在LOG文件中写入Debug信息
BOOL WINAPI SnmpUtilDbgPrint( INT nLogLevel,//错误级别 LPSTR szFormat,//打印格式 … //其它打印参数 ); 11)SnmpUtiPrintAsnAny:打印存储在AsnAny对象中的值。
30
6.2.4 服务API 见P181-182 服务API(SNMPAPI.DLL)包含19个函数,这些函数用在SNMP.EXE中。
在windows 2000中正式公布 见P
31
6.3 扩展代理的实现 扩展API的4个函数用在扩展代理中。其中SnmpExtensionInit, SnmpExtensionQuery, SnmpExtensionTrap,应该出现在每个扩展代理中,另一个函数SnmpExtensionInitEx是任选,根据扩展代理的需要;每个扩展代理是通过这些函数与SNMP通信的,一般不需要执行其它的线程。 6.3.1扩展代理动态连接库 扩展代理被SNMP服务装入后,首先调“入口函数”,然后调用SnmpExtensionInit(或SnmpExtensionInitEx ),完成必要的初始化工作。(例如:变量运行时间赋值;为缓冲区分配内存;进程,线程和事件生成等) 1)DLL入口函数 dwReason的值为DDL-PROCESS-ATTACH,则DllMain被调用后完成初始化 dwReason的值为DDL-PROCESS-DEATTACH,则DllMain被调用后,进行卸载,完成关闭句柄,释放内存,通知主进程等。 见书182-183 2)初始化函数1 DLL转入成功就调用SnmpExtensionInit函数进行初始化操作。 见书P
32
3)初始化函数2(提供多个MIB子树登记) 如果DllMain和SnmpExtensionInit调用成功,SNMP服务就检查扩展代理中是否有SnmpExtensionInitEx函数.如果有,发付调用,把所有的扩展代理支持的MIB子树登记完毕.即直到该函数返回FALSE为止. 见P185-186页 4)SnmpExtensionQuery函数 作用:处理请求报文(Get,GetNext,Set)报文中的变量绑定表,生成应答报文GetResponse中的变量绑定表,并决定错误状态。 注意1:由于每个扩展代理只处理自己管理的那部分MIB变量,所以SNMP服务收到一个请求报文后,必须把变量绑定表的内容按照各个已装入的扩展代理的管辖范围分成若干部分,交给相应的扩展代理处理。 注意2:ResolveVarBind处理变量绑定表对 见P
33
6.3.2 MIB数据库的实现 MIB数据库文件(*.mib)组织成一维数组,每个元素是结构类型MIBVARS 1)MIBVARS结构定义: Typedef struct-MibVars { AsnObjectIdentifier Oid;/*mib变量的对象子标识符*/ void *pStroage; /*本地存储器地址指针*/ void *ptempVar; /*缓冲变量指针,set命令用*/ BOOL fModified; /*指示变量的值是否被改变过*/ BYTE bType; /*变量类型*/ DWORD dwMinVal; /*变量最小值*/ DWORD dwMaxVal; /*变量最大值*/ UINT uAccess;/*访问模式*/ UINT (MinFunc)(UINT,struct-MibVars*,RFC1157VarBind*) /*实现变量操作函数,参数为:操作类型,变量元素 指针,变量绑定表指针*/ struct-MibVars MibNext;/*指向下一个指针*/ }MIBVARS
34
2)MIB的定义: 见P 3)搜索MIBVARS的数据库 见P 4)搜索的结果 见P
35
6.4 陷入的实现 实现陷入的扩展函数是SnmpExtensionTrap. 6.4.1 陷入设计: 1)代理的作用:检测陷入事件,收集陷入数据,发送陷入消息。 2)单状态事件:用户击键,输入口令,SNMP报文认证失败等事件,通常用计数器跟踪单状态事件出现的次数,达到一定的门限即触发陷入。 3)多状态事件:被监视的变量值在多个状态之间转换,例如:指示灯ON/OFF转换,主机电源开、关等,这类事件用整型变量指示其所处的状态。 4)陷入决策问题:决定那些事件可以引起陷入;另外陷入的报文应该包含那些数据。如果陷入是基于MIB,则可陷入的事件就已经确定了,甚至可以写到文档中;如果基于企业的MIB,则要根据企业的标准或设备的特点决定那些事件可以引入陷入。(陷入一般分为不同的优先级) 5)陷入的管理模式:陷入制导轮询(见P37):管理站启动或每隔一定时间,用Get操作轮询一遍所有代理,得到某些关键的信息或基本性能统计数据,得到数据后停止轮询;而代理进程负责在必要的时间向管理站报告异常事件,并通过陷入操作传给管理站,得到异常事件的报告,管理站可以查询有关的代理,以便得到更具体的信息,对事件的原因作进一步的分析。
36
6)陷入的记录:记录信息; 信息收集时可能有延迟。 6.4.2 扩展代理支持的陷入 1)扩展代理实现陷入的两个函数:SnmpExtensionInit,SnmpExtensionTrap. 例子(P194): 主要功能:调用CreatEvent函数产生一个事件,用于支持的陷入句柄通知SNMP服务;如果产生事件失败则函数SnmpExtensionInit返回FALSE,表示无法初始化;函数SnmpExtensionTrap为一个陷入收集数据,这些数据来自全局变量,经该函数的参数传递给SNMP服务;静态变量fCleanUp的作用是区分两种操作:提供陷入数据或清除前次发送陷入占用的缓冲区。
37
6.4.3 陷入检测 陷入检测主要包括:用什么检测陷入和怎样检测陷入。 1)事件检测和数据收集 扩展代理完成事件检测和数据收集 外部进程完成事件检测,扩展代理完成数据收集 扩展代理完成事件检测,外部进程完成数据收集,然后通过进程间通信机制把数据传送给扩展代理。 外部进程完成事件检测和数据收集,然后通过进程间通信机制把数据传送给扩展代理。 2)事件检测方法: 通常的检测方法是主动轮询。扩展代理生成一个线程,经常检查特殊条件是否出现,检测到一个事件后就收集有关数据,并通知扩展代理发送陷入。 主动轮询:由SetTimer或SetWaitableTimer生成的定时器,扩展代理在一定时间间隔上检查陷入事件。(可能会有延迟,轮询信息可能占用大量的网络带宽,影响正常的网络通信) 被动等待:有一种触发机制,在可陷入事件时由监视线程发出通知。唤醒扩展代理发送陷入报文。(必须支持通知机制)
38
6.5 SNMP 管理应用程序接口 Microsoft的管理应用程序接口(MGMTAPI.DLL)有7各函数它们的功能见P177.
6.5.1 Microsoft MIB编译器: Microsoft MIB编译器MIBCC.EXE是支持管理应用的附属工具,它的作用是把人工可读的数据格式,产生二进制文件MIB.BIN,由管理应用程序使用。 其基本格式见P 6.5.2管理API头文件 1)头文件:管理API使用的常数和数据类型包含在头文件MGMTAPI.H中: #include <snmp.h> #include <winsock.h> #ifdef –cplusplus … #endif
39
2)数据类型定义: Typedef struct –SNMP_MGR_SESSION{ SockDesc fd;//由Winsock API返回的网络管套描述符 struct sockaddrdestAddr,//网络连接的远方地址 LPSTR community,//团体名 INT timeout,//打开管套或等待响应超值 INT retries,//重新发送次数 AsnInteger requestID,//请求标识 char recvBuf[RECVBUFSIZE],//用于存储响应报 文的缓冲区 }SNMP-MGR-SESSION,*LPSNMP-MGR-SESSION;
40
6.5.3 管理API功能 管理API 由7个函数组成: 1)SnmpMgrOpen:在发送请求之前调用该函数,打开与SNMP代理的连接。 LPSNMP_MGR_SESSION SNMP_FUNC_TYPE SnmpMgrOpen( IN LPSTR lpAgentAddress, // Name/address of target agent IN LPSTR lpAgentCommunity, // Community for target agent IN INT nTimeOut, // Comm time-out in milliseconds IN INT nRetries // Comm time-out/retry count ); 如果建立连接成功,函数返回指针LPSNMP_MGR_SESSION结构指针;如果失败,返回空指针。
41
2)SnmpMgrClose:这个函数关闭到SNMP代理的连接管套
BOOL SNMP_FUNC_TYPE SnmpMgrClose( IN LPSNMP_MGR_SESSION session // SNMP session pointer ); 如果连接关闭,该函数返回TRUE,否则返回FALSE.
42
3)SnmpMgrRequest:用这个函数可以发送Get,GetNext和Set请求报文。该函数是异步操作,在接收到响应或超时后才返回结果。
SNMPAPI SNMP_FUNC_TYPE SnmpMgrRequest( LPSNMP_MGR_SESSION session, // SNMP session pointer IN BYTE requestType, // Get, GetNext, or Set IN OUT RFC1157VarBindList *variableBindings, // Varible bindings AsnInteger *errorStatus, // Result error status AsnInteger *errorIndex // Result error index ); 如果请求成功,函数返回TRUE,并接受到响应报文;否则返回FALSE。 注意: P176 typedef AsnObjectIdentifier AsnObjectName; typedef AsnAny AsnObjectSyntax;
43
4)SnmpMgrStrToOid:该函数利用MIB
4)SnmpMgrStrToOid:该函数利用MIB.BIN中的数据把对象标识符转变成等价的AsnObjectIdentifier类型。函数的原型是: BOOL SNMP_FUNC_TYPE SnmpMgrStrToOid( LPSTR string, // OID string to be converted AsnObjectIdentifier *oid // OID internal epresentation ); 例如: 设:*pString=“system.sysdescr”,或“ ”,或“ system.sysDescr” 则snmpMgrStrToOid(pString,&oid),则结果是:iod.idlength=9;oid.ids=
44
5)SnmpMgrOidToStr:该函数利用MIB
5)SnmpMgrOidToStr:该函数利用MIB.BIN中的数据把AsnObjectIdentifier类型转变成等价对象标识符类型。函数的原型是: SnmpMgrOidToStr( AsnObjectIdentifier *oid, // OID to be converted LPSTR string // OID string representation ); 例如: 设:iod.idlength=9;oid.ids= 则snmpMgrOidToStr (&oid , pString),则结果是:*pString=“system.sysdescr”
45
6)SnmpMgrGetTrap:SNMP接收的陷入数据都交给该函数;它被陷入服务周期的调用,以便轮询需要接收的陷入报文。函数原型:
BOOL SNMP_FUNC_TYPE SnmpMgrGetTrap( AsnObjectIdentifier *enterprise, // Generating enterprise AsnNetworkAddress *IPAddress, // Generating IP address AsnInteger *genericTrap, // Generic trap type AsnInteger *specificTrap, // Enterprise specific type AsnTimeticks *timeStamp, // Time stamp RFC1157VarBindList *variableBindings // Variable bindings );
46
7)SnmpMgrTrapListen:该函数的作用是在陷入服务和管理API之间建立命名管道,使得管理应用程序可以接收陷入报文。函数原型是:
BOOL SNMP_FUNC_TYPE SnmpMgrTrapListen( HANDLE *phTrapAvailable // Event indicating trap available ); 例子见P203
47
6.6 网络管理应用程序设计 [1] 概念: 1)管理平台:通用的网络管理程序,它提供一组通用的网络管理功能,也提供实现专用管理程序的工具。
如:网络自动发现;拓扑生成;MIB编译器;MIB浏览器;陷入记录;管理轮询等 2)网络管理平台必备工作: 1)确定被管理结点的网络地址(IP地址, IPX地址, DNS主机名) 2)确定远程目标的端口号(UDP 161,专用端口号>1024) 3)确定接收陷入的端口号(UDP 162,专用端口号>1024) 4)确定团体名(通常为public,如果用两个团体名,则read-only团体名为public;read-write团体名为private) 5)确定响应定时器等待时间间隔 6)确定重复请求次数 7)确定轮询时间间隔。
48
6.6 网络管理应用程序设计 [2]管理应用的基本功能: 基本功能:辅助管理员监视网络,发现活动的网络设备,排除网络故障。 1)网络发现:
方法1:探测站点,向子网中所有站发送ICMP报文,把收到应答的标记活动点;标识SNMP网络结点,向活动站点发送GetRequest报文;根据收集的信息可以建立网络发现数据库。 方法2:读取ARP缓冲区以及本地路由器和管理主机接口表,发现可连接的设备,然后有选择的发送ICMP;标识SNMP网络结点,向活动站点发送GetRequest报文;根据收集的信息可以建立网络发现数据库。 (活动站点的基本信息:系统组的sysDescr和system;地址转换组等) 2)管理站轮询:定期轮询活动站点,可以利用ICMP报文检查站点活动状态,或利用SNMP收集管理信息。
49
3)MIB编译器和数据库:MIB模块以ASN.1编写,以ASCII文件存储,编译后转换成代理可利用的格式。MIB数据库是MIB模块的集合。
4)MIB浏览器:这个程序的功能是用搜索目录树的方法,定位和显示MIB库中的被管对象的值,可以通过向某个MIB对象发送GetNextRequest请求,接收和显示变量绑定表中的内容。 5)MIB搜索器(Walker):比较简单的MIB浏览器。 6)陷入信息记录:管理应用接收到一个陷入报文,根据信息进行处理。 [3]行为规则: 设计管理应用程序时要遵守一些行为规则,才能实现高效而有用的软件,要注意下面规则: 1)报文的大小:一般每个请求不超过16个变量绑定表,请求报文总长度不超过1000字节。 2)简单代理: 3)轮询间隔: 4)有目的的陷入:
Similar presentations