怎么用 snmp++ 提供的函数netlink获取路由表表

捷配欢迎您!
微信扫一扫关注我们
当前位置:&>>&&>>&&>>&基于SNMP 的校园网管理系统的设计与实现
&&&& 摘要: 介绍了一个适合于校园网的基于SNMP 的网络管理系统的设计与实现。以管理者/代理为模型,采用分层次的总体设计方案。在分析比较现有拓扑发现算法的基础上,给出一种改进的拓扑发现算法,融合二叉树排序策略和三层发现策略。在实时性能参数采集分析的基础上,结合概率论与数理统计的思想,建立了一元线性回归模型,对性能参数进行有效的区间预测。系统不仅设计了网络的拓扑结构发现及显示、配置管理、性能管理等核心功能, 更针对性地设计了网络性能预测、流量排序、病毒及非法软件检测等功能。
  目前市面上有很多商品化网管软件, 如IBM 公司的NetView、HP 公司的OpenView、SUN 公司的Sun NetManager等, 这些网络管理软件尽管功能很强大, 但提供的是一个通用的网络管理平台, 对于具体校园网管理应用, 还得进行进一步的规划和开发。因此, 迫切需要开发一个适用于高校校园网的网络管理系统对日常的网络设备和网络运行情况进行监督与维护。
  1 系统总体设计
  本网络管理系统的总体设计目标就是要构建一个基于SNMP 的多代理的统一管理、简便直观、兼容不同厂商设备、能够实现网络拓扑结构发现、配置管理、性能管理等功能, 并针对校园网上机特点, 实现对所有运行主机的管理。具体内容如下:
  (1) 网络拓扑结构发现。
  找出与、路由器与子网之间的连接关系, 并发现所有子网中活动的IP 设备, 区分出路由器、交换机和普通主机。对网络拓扑发现结果进行图形化显示。
  (2) 配置管理。
  本系统的配置管理主要实现路由器( 或三层交换机)的配置管理和主机的配置管理。路由器配置管理具体包括获取路由器的常规配置参数( 如设备类型、负责人、支持服务、所在位置等), 获取路由表信息、地址表信息、地址转发表信息、表信息以及接口状态表信息等。主机配置管理包括查看主机的基本信息、安装软件信息、运行软件信息、信息、硬件设备信息等主机资源信息。
  (3) 性能管理。
  对代理设备的原始性能数据进行实时采集。对采集到的性能数据进行分析, 计算接口流量、协议流量等各种性能参数, 为管理员提供参考。
  查询某一时段代理设备的性能参数,生成性能曲线,以直观图的方式显示性能分析结果。
  根据某一时段代理设备的性能分析结果, 对网络性能进行分析预测, 并以直观图的形式显示出来, 为网络管理员采取进一步措施提供依据。
  (4) 流量排序。
  流量排序分为接口流量排序和主机流量排序。接口流量排序是对网络中所有发现的接口进行流量采集并排序, 将结果以直观图的形式显示出来, 供管理员查看。
  主机流量排序对网络中某一子网内所有主机流量进行实时采集并排序, 将结果以直观图的形式显示出来, 供管理员查看。
  (5) 病毒及非法软件检测。
  对网络中某一子网内所有主机进行病毒或非法软件排查工作, 找出该子网内所有运行指定软件名称的主机, 并将结果以直观图的形式显示出来, 供管理员查看。
  2 系统模型结构
  本网络管理系统以SNMP 网络管理协议的管理者/代理模型为基础, 以HP 公司的SNMP ++ 为数据采集工具, 采用分层的方法, 面向系统的不同功能设计而成。
  该系统分为三个部分如图1 所示: 底层数据通信、中间层数据处理与上层数据表示。底层数据通信部分负责实现管理者与被管设备之间的通信, 获取代理设备中MIB 库的有用信息, 并把采集到的数据送往上层。中间层数据处理部分负责对采集到的网络信息进行处理, 将相应的处理结果传给上层管理应用层进行显示。上层为数据表示层, 对网络的配置管理、性能管理等功能模块以表格和可视化的图形界面显示,简洁直观。
图1 系统设计框架的分层编辑结构
  3 系统关键技术分析
  3.1 网络拓扑结构发现算法的研究与分析
  基于SNMP 协议的算法实际上是提取MIB 中ipRouteTable( 路由表) 中的对象, 类似于图论中的广度优先遍历算法实现网络拓扑的自动搜索。
  设计路由发现算法时主要用到了三条链表: 待检路由设备链表、拓扑信息链表、子网信息链表。基于SNMP的拓扑发现算法通常是使用一个种子路由器, 获取其路由表内记录的所有可达网段, 以及到达该网段所经由的下一跳路由器的端口IP 地址及相关路由信息, 然后将继续扩展其搜索, 一直达到用户指定的深度为止。同时种子路由器还可以获取到每个路由设备上所有端口的直连子网及其相应的子网掩码, 根据这些信息, 进而获取到这些子网中的所有活动主机。如果这些设备支持SNMP, 则还可以进一步收集系统和IP 地址信息。总之,只要给出一个路由设备任意端口的IP 地址作为种子路由器( 通常使用本地的IP 地址作为种子路由器的地址), 即可获取到指定深度内的所有路由设备及活动主机的网络拓扑结构信息。
  (1) 默认网关的获取。
  拓扑发现算法首先是从网络管理站的默认网关开始, 逐步遍历默认网关的路由表和地址解析表, 最终发现整个网络的拓扑结构。本系统获取默认网关是采取这样的方法: 首先, 访问拓扑发现程序所在计算机的SNMPMIB 中的ipRouteTable , 如果发现有ipRouteDest 值为0.0.0.0 的记录,则说明程序所在的计算机设置了默认网关, 该记录的ipRouteNextHop 值即为默认网关的地址。检查默认网关的ipForwarding 值, 如果为1, 则表明该默认网关确实是路由设备, 否则不是。
  (2) 设备类型判断。
  利用SNMP 协议, 提取MIB 中的sysservices对象实例值, 然后根据返回的值判断类型。如果目的设备不返回SNMP 响应报文或响应超时, 则认为设备没有配置SNMP,类型为一般工作站。
  (3) 路由器多IP 地址问题:
  由于路由器可以连接多个子网, 具有多个接口, 即一个路由器可能含有多个IP 地址。为了准确标识具有多个接口的路由器,避免重复,本算法通过访问路由器的地址表获得路由器的所有接口,这样可以根据当前路由器的IP 是否在已经遍历过的路由器接口列表中来判断。
  3.2 性能预测模块的设计
  本模块根据一元回归模型的数学原理, 找出网络流量与时间之间的关系,建立一元线性回归方程:。
  本系统默认预测分析算法的置信度为1 -α=0.95 。
  在性能参数采集分析结果的基础上对性能参数的变化趋势进行预测。
  图2 是该模块的性能预测流程图。
图2 性能预测流程图。
  图2 中,数据差分处理主要是有一些变量是逐渐增加的( 如某接口的流出字节数), 而系统关心的是两次流出字节数的差值,数据处理就是算出差值。趋势分析主要是计算出分析期间内的一元回归直线, 以便在用户界面上显示出来时, 网络管理者很容易看出它的增减趋势。而状态分析主要是将系统关心的一些变量的状态分析出来并报告给网络管理系统,以便系统根据变量的当前状态及时对其作出调整。
  3.3 病毒及非法软件检测模块的设计
  本系统中主机感染病毒或运行非法软件功能的实现是在拓扑发现结果的基础上,理员指定子网内的所有主机进行运行软件数据采集,将各主机中正在运行的软件名称和管理员指定的软件名称进行对比, 最终排查出该子网内具体有哪些主机运行了指定的软件, 并将排查结果存入相应的数据结构中,以直观图的形式显示出来。具体流程图如图3 所示。
图3 病毒及非法软件检测流程图。
  4 系统性能测试
  4.1 流量分析功能测试
  本系统对网络中指定路由器各性能参数进行实时采集分析, 将分析结果以曲线图的形式显示出来, 如图4 所示。图4 中,细线表示接口入流量速率, 粗线表示接口出流量速率。与同类产品(如华为Quideway) 比较, 发现该流量实时采集模块采集分析结果与成熟网管软件分析结果无实质性差别,能够及时给网管人员提供有效信息数据,该模块具有正确性和可用性。
  4.2 流量预测功能测试
  在流量采集分析的基础上运行系统性能预测功能,结果如图5 所示。该部分流量预测模块是在图4 接口流量采集分析基础上,利用了一元线性回归模型和区间预测算法,计算分析将来某一时刻接口的可能流量范围和流量发展趋势。本系统默认该预测分析算法的置信度为1-α=0.95,系统流量预测结果与运用数学工具计算分析结果相吻合,系统具有正确性。
  通过本系统在某高校试运行,结果显示该部分预测分析功能模块能够帮助网络管理员采用数学分析方法对网络流量进行及时预测,进而使得网络管理人员可及时发现网络问题并采取进一步措施, 取得理想效果, 该模块功能具有实用性和可靠性。
  4.3 主机运行非法软件及感染病毒模块性能测试
  运行该部分功能对指定子网内所有主机运行QQ 应用程序进行排查,系统运行结果如图6 所示。
  通过具体的实地调查发现,该子网内所有用户在该时刻运行主机应用软件情况与系统运行结果完全吻合,由此可见该系统具有正确性和有效性。本部分功能模块有助于网络管理员限制某些对网络流量产生破坏的非法软件或病毒运行,将子网内运行非法软件或病毒的所有主机排查出来,网络管理员可根据具体情况对这些主机用户进行警告等处理。
  本文深入地分析了SNMP 简单网络管理协议, 结合校园网网络管理需求的特点, 设计并实现了一个基于SNMP 的网络管理系统。在本系统的设计与研究过程中,系统性分析了SNMP 协议的原理、网络管理的关键技术以及拓扑发现算法,给出了一种融合二叉排序树策略和三层交换机发现策略的拓扑发现算法,能够发现网络中三层交换机和子网内所有主机,并对拓扑发现的结果进行图形化显示。在网络拓扑发现结果的基础上, 进一步设计并实现了配置管理、性能管理、流量排序、病毒及非法软件检测等功能模块。该网络管理系统已经在北航计算机学院教学实验中心试运行并取得了较好的效果。&&参考文献:[1].&MIB &datasheet&.来源:
技术资料出处:fsclub
该文章仅供学习参考使用,版权归作者所有。
因本网站内容较多,未能及时联系上的作者,请按本网站显示的方式与我们联系。
【】【】【】【】
上一篇:下一篇:
本文已有(0)篇评论
发表技术资料评论,请使用文明用语
字符数不能超过255
暂且没有评论!
12345678910
12345678910
12345678910
  推挽式开关电源使用的开关变压器有两个初级线圈,它们都属于励磁线圈,但流过两个线圈的电流所产生的磁力线方向正好相反,因此,推挽式开关电源变压器属于双激式开关电源变压器;另外,推挽式开关电源变压器的次级线圈会同时被两个初级线圈所产生的磁场感应,因此,变压器的次级线圈同时存在[][][][][][][][][][]
IC热门型号
IC现货型号
推荐电子百科基于WinSNMP的网络管理程序设计----原理与实践(第三章)基于WinSNMP的网络管理程序设计----原理与实践(第三章)
&第三章 Snmp在Windows下的实现----WinSNMP编程原理&在Windows下实现SNMP协议的编程,可以采用Winsock接口,在161,162端口通过udp传送信息。在Windows 2000中,Microsoft已经封装了SNMP协议的实现,提供了一套可供在Windows下开发基于SNMP的网络管理程序的接口,这就是WinSNMP API。3.1& 什么是WinSNMPWinSNMP的目的是为在Windows下开发基于SNMP的网络管程序提供解决方案。它为SNMP网管开发者提供了必须遵循的开放式单一接口规范,它定义了过程调用、数据类型、数据结构和相关的语法。图3.1显示了一个网络管理站(NMS)和网络管理代理(Agent)之间端到端的SNMP连接中WinSNMP所处的层次。这是一个WinSNMP的参考模型。&图3.1WinSNMP参考模型总的来说,WinSNMP以函数的形式封装了SNMP协议的各部分(在VC++6.0开发环境中体现为wsnmp32.dll、wsnmp32.lib和winsnmp.h),且针对SNMP是使用UDP的特点而设置了消息重传、超时机制等。3.2& 一些基本概念在WinSNMP编程中,我们需要考虑的基本概念主要有以下几点: SNMP支持层次 Entity/Context转换模式 本地数据库 会话 异步模式 内存管理下面我们将分别对它们作介绍。3.2.1& SNMP支持层次(Levels of SNMP Support)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实现所能提供的最大支持层次。3.2.2& Entity/Context转换模式(Entity/Context Translation Modes)WinSNMP应用程序能够让WinSNMP实现把entity和context参数按不同的方式解释:(1)按字面解释为SNMPv1代理的地址和共同体(community)字符串。(2)解释为SNMPv2的party和context标识符(context IDs)。(3)通过查询本地数据库将其转换为各自的SNMPv1或SNMPv2元素。三种Entity/Context转换模式如下:SNMPAPI_TRANSLATED = 通过本地数据库查询转换SNMPAPI_UNTRANSLATED_V1 = 转换为地址和共同体(community)字符串SNMPAPI_UNTRANSLATED_V2 = SNMPv2的party和context IDs.我们可以通过SnmpStartup函数获得当前默认的entity/context转换模式,SnmpSetTranslatedMode函数可以用来设置entity/context转换模式。当在系统中采用SNMPv1协议时,我们可以将其设置为SNMPAPI_UNTRANSLATED_V1,具体实现如下:HSNMP_ENTITY hAHSNMP_CONTEXT hVLPCSTR entityName = “202.120.86.71”;smiOCTETS contextNcontextName.ptr = “public”;contextName.len = lstrlen (contextName.ptr);hAgent = SnmpStrToEntity (hSomeSessin, entityName);hView = SnmpStrToContext (hSomeSession, const &contextName);通过这样的设置,我们就可以在161端口通过UDP访问IP地址“202.120.86.71”上的SNMP代理了。3.2.3& 本地数据库(Local Database)本地数据库主要存储重传模式(RetransmitMode)、重试次数(Retry)、超时(timeout)、转换模式(TranslateMode)等值。我们可以对其中的数据进行读(get)、写(set)操作。3.2.4& 会话(session)会话是用来管理WinSNMP应用程序和WinSNMP实现之间的连接,由SnmpCreateSession(推荐)或SnmpOpen函数创建。会话是资源管理的最小单位,也是WinSNMP应用程序和WinSNMP实现之间通信管理的最小单位。一个良好的WinSNMP应用程序应该使用会话结构逻辑地管理它的操作,并将实现中的资源需求控制在最小。调用SnmpCreateSession或SnmpOpen函数创建一个会话时,会返回一个“session id”,这是一个句柄(handle)变量,WinSNMP用它来管理自己的资源。应用程序最终应调用SnmpClose函数将会话释放。3.2.5& 异步模式(Asynchronous Model)当代编程模式的一个很大特点就是消息驱动。WinSNMP采用了异步消息驱动模式,主要基于两个原因:(1) 异步消息驱动模式非常适合于面向对象理论、SNMP分布式管理模型以及Windows编程、运行环境。(2) SNMP再管理站和代理之间传送数据没有什么特别的传输机制,它基本上是基于数据报的,没有在远程实体之间建立实际通道(虚电路)。这样的事实使得WinSNMP非常适合采用异步模式。现代的消息驱动程序必须响应各种重要事件,有些则完全依赖于异步关系。事实上,WinSNMP API中几乎所有函数都有异步成分,有些则是完全异步的。有三个非常重要的异步函数: SnmpSendMsg& (发送数据) SnmpRecvMsg& (接收数据) SnmpRegister (注册接受trap消息)WinSNMP的整个编程模式就是基于异步的,我们将在后面做详细介绍。3.2.6& 内存管理(Memory Management)在Windows编程中,内存管理一向是一个令人头疼的问题。在这里,我们将对WinSNMP的内存管理做一个较为详尽的描述。WinSNMP包括三种不同的内存“对象”: 句柄式资源 (HANDLE’d Resources) C风格(以NULL结尾)的字符串 WinSNMP API结构类型3.2.6.1& 句柄式资源 (HANDLE’d Resources)有五种句柄式资源的变量: Sessions Entities Contexts Protocol Data Units (PDUs) VarBindLists (VBLs)所有句柄对象都表示为“HSNMP_&object_tag&”的形式,它为WinSNMP实现(以DLL方式)所拥有。3.2.6.2& C风格字符串 (C-Stytle Strings)C风格的字符串主要用来为通用的字符串表示与Entity和对象标识符(OID)对象之间的转换提供便利。WinSNMP中使用C风格字符串的函数有:SnmpStrToEntity、SnmpEntityToStr、SnmpStrToOid、SnmpOidToStr。C风格字符串的内存分配、管理和释放完全由应用程序负责。因此我们还需要传递“size”参数给使用它的函数。3.2.6.3& 描述符 (Descriptors)WinSNMP中有三种结构类型: smiOCTETS smiOID smiVALUE前两种类型的定义如下:typedef struct {&&&& smiUINT32& &&&& smiLPBYTE& }&smiOCTETS;typedef struct {smiUINT32&&& &&&& smiLPUINT32&& }&smiOID;smiVALUE稍微复杂一点,它的定义如下:typedef struct {&&&&&smiUINT32&&&&union {&smiINT&&sN&&smiUINT32&uN&&smiCNTR64&hN&&smiOCTETS&&&&smiOID&&&&&smiBYTE&&&&&&&&&&&}&&&&&}&&smiVALUE;当一个应用程序得到一个smiVALUE变量时,首先必须检查它的“syntax”成员,已决定怎样取到它的第二个成员。当“syntax”成员变量显示“value”值是一个smiOCTETS或smiOID对象时,我们就应该考虑内存管理,约定如下:(1)& 当其作为输入参数时,应用程序负责为变长对象分配内存;(2)& 当其作为输出参数时,由WinSNMP实现(表现为DLL)为变长对象分配内存。&3.2.6.4& 内存的释放WinSNMP应用程序必须负责释放所有通过调用WinSNMP API函数所分配的资源,主要有以下三类函数: SnmpFree&xxx&: 释放Entity、Context、Pdu、Vbl、Descriptor SnmpClose&&& : 关闭会话 SnmpCleanup& : 必须在程序结束之前调用,释放所有资源应用程序推荐使用上述的顺序来释放所有的WinSNMP资源。3.3& WinSNMP基本编程模式WinSNMP API按照SNMP协议封装了各种操作,包括PDU、VarBindList以及协议操作的各项函数。我们可以按照SNMP协议的描述,调用WinSNMP相关函数,完成一次完整的SNMP。我们下面将以笔者完整的系统(采用SNMPv1协议)为例,具体描述WinSNMP的一般编程模式。我们分发送请求消息与接受响应消息两部分来实现。3.3.1& WinSNMP发送请求消息WinSNMP发送请求消息的过程可以分为四个部分,主要有:WinSNMP的初始化、PDUs的创建、发送信息以及资源的释放。3.3.1.1& WinSNMP的初始化(1) 调用SnmpStartup函数启动WinSNMP。(2) 调用SnmpCreateSession函数创建一个会话session。(3) 调用SnmpSetRetransmitMode函数设置重传模式。(4) 调用SnmpSetRetry函数设置重传次数。(5) 调用SnmpSetTimeout函数设置超时时间。其中第3、4、5步都是对本地数据库的操作,完成了对WinSNMP相关参数的设置。3.3.1.2& 创建协议数据单元(PDUs)在创建PDU之前,我们必须先创建变量绑定表(varbindlists)。(1) 调用SnmpStrToOid函数创建读取对象的OID,例如,我们创建MIB变量ipInReceives(一个实例的OID为1.3.6.1.2.1.4.3.0),我们可以采用下面的代码:LPCSTR name="1.3.6.1.2.1.4.3.0";smiOID OSnmpStrToOid(name,&Oid);(2) 调用SnmpCreateVbl函数创建变量绑定表。HSNMP_VBL m_hvbl=SnmpCreateVbl(session,&Oid,NULL);(3) 调用SnmpSetVb函数往变量绑定表中添加变量绑定,我们需先创建一个OID,命名为Oid。SnmpSetVb(m_hvbl,0,&Oid,NULL);创建好了变量绑定表后,我们调用SnmpCreatePdu函数创建协议数据单元,在这个函数中,我们必须设定error_index、error_status、request_id参数,它们都与协议中相应的量对应。HSNMP_PDU m_hpdu=SnmpCreatePdu(session,SNMP_PDU_GET,NULL,NULL,NULL,m_hvbl);3.3.1.3& 发送信息我们首先调用SnmpStrToContext和SnmpStrToEntity函数创建共同体(community)字符串和代理entity,具体实现见3.2.2。然后,我们调用SnmpSendMsg函数发送信息。SnmpSendMsg(session,NULL,hAgent,hView,m_hpdu);3.3.1.4& 资源的释放最后,我们应该释放所有分配的资源。3.3.2& WinSNMP接受响应消息还记得前面的SnmpCreateSession函数吗?它可以说是WinSNMP异步消息驱动模式的一个关键,让我们先来看看它的函数原型:HSNMP_SESSION SnmpCreateSession(& HWND hWnd,&&&&&&&&&&&&&&&&&&& // handle to the notification window& UINT wMsg,&&&&&&&&&&&&&&&&&&& // window notification message number& SNMPAPI_CALLBACK fCallback,&& // notification callback function& LPVOID lpClientData&&&&&&&&&& // pointer to callback function data);它提供了两种方式的异步消息驱动,我们可以让WinSNMP在有响应消息到达时发送一个消息给系统,也可以让它自动调用一个函数。笔者采用了第一种方式,实现如下:session=SnmpCreateSession(m_hWnd,wMsg,NULL,NULL);我们可以给消息wMsg创建一个消息处理函数,在这个函数里处理消息的接收、信息的提取与处理等事务。下面我们将具体描述WinSNMP接受响应消息的步骤。(1) 调用SnmpRecvMsg函数接收数据(2) 调用SnmpGetPduData函数从PDU中析取出数据,(3) 调用SnmpCountVbl获得变量绑定列表中变量绑定的个数(4) 调用SnmpGetVb函数取得PDU变量绑定表中每个变量绑定的OID及其对应的值,可以指明该变量绑定在变量绑定表中的位置。参考实现如下:int nCount=SnmpCountVbl(varbindlist);for(int index=1;i&=nCi++)& SnmpGetVb(varbindlist,index,&Oid,value[i]);其中,index指定了变量绑定的位置,value[i]表示接收到的OID变量的值,是smiLPVALUE类型的,Oid表示接收到的变量绑定的OID。对于value[i],我们可以参考3.2.6.3节,按照它的syntax成员,用select case语句,分别转换为字符串或整数类型。(5) 调用SnmpOidToStr函数将Oid转换为字符串。并将接收到的Oid与发送数据包的各OID做比较,已决定各自值的归属。引用一段代码if(strcmp(m_sOid[i],m_initOid[1])==0)&&m_sDesr= str[i];&else if (strcmp(m_sOid[i],m_initOid[2])==0)&&m_sSysOid=str[i];&else if (strcmp(m_sOid[i],m_initOid[3])==0)&&m_sSysTime=str[i];&else if (strcmp(m_sOid[i],m_initOid[4])==0)&&m_sName=str[i];&else if (strcmp(m_sOid[i],m_initOid[5])==0)&&{m_sIpin=str[i];&&m_nIpin=nI}&else if(strcmp(m_sOid[i],m_initOid[6])==0)&&m_sIpout=str[i];当我们比较发送的OID与接收到的OID时,我们就知道了这个str[i]是属于哪个OID的值,应当放在哪里显示,以m_s开头的变量都代表了不同的label,这样,相应的值就在相应的字符串中显示。通过这样的步骤,我们就完成了一个简单的SNMP网络管理程序的设计。但是,在具体的应用中,我们应该考虑更多的问题,如内存管理、错误处理等问题,还有很多问题需要我们在系统开发的过程中去发现、解决。下面,我将描述几个我在系统开发中遇到的问题,有的已经解决,有的还在探索中,希望能为同仁提供参考。3.4& 几个问题3.4.1 读IP地址前面讲到,IpAddress是SMIv1的一个应用数据类型,表示IP地址,它的定义为:IpAddress::=[APPLICATION 0] IMPLICIT OCTET STRING(SIZE(4))当我们读取一个表示IP地址的OID时,我们应该分别读出IpAddress四个字节的值,再将它们处理成我们平时见到的IP地址的形式。代码如下:case SNMP_SYNTAX_IPADDR:strIp.Format("%d",*m_value[i]-&value.string.ptr);&&strIp+=".";&&strTemp.Format("%d",*(m_value[i]-&value.string.ptr+1));&&strIp+=strT&&strIp+=".";&&strTemp.Format("%d",*(m_value[i]-&value.string.ptr+2));&&strIp+=strT&&strIp+=".";&&strTemp.Format("%d",*(m_value[i]-&value.string.ptr+3));&&strIp+=strT3.4.2& GETNEXT操作的实现GETNEXT是SNMP中用来读取表格变量的一个操作。在WinSNMP中,我们可以通过SnmpCreatePdu(session,SNMP_PDU_GETNEXT,NULL,NULL,NULL,m_hvbl)来创建一个GETNEXT操作的PDU。关键的问题是我们如何对这个表格作遍历。(1).如何判断表格的结束;(2).在接收到响应消息时如何处理。我们下面将以笔者系统为例,说明这些问题。我们将获得本机的路由表的一部分。先构造一个函数,代码如下:void CSnmpManagerDlg::Next(LPTSTR Oid){&CString str(Oid);&if(!strcmp(str.Left(20),"1.3.6.1.2.1.4.21.1.7"))&{&&理接收到的数据&&pSnmp.CreateVbl(Oid,NULL);&&pSnmp.CreatePdu(SNMP_PDU_GETNEXT,NULL,NULL,NULL);&&pSnmp.Send("127.0.0.1","public");&}&else &{&&m_bNext=FALSE;&&去显示&}}我们把接收到的OID的前20位与路由next hop MIB变量("1.3.6.1.2.1.4.21.1.7")作比较,假如不等,就说明这一列已经结束。把数据送去显示或进一步处理。我们可以为这一操作创建一个新的会话(session),或继续使用前面GET操作的会话。创建一个新的会话时,我们为这个会话指定一个消息处理函数,并在这个函数中,处理接收到的数据,以及调用Next(LPTSTR Oid)函数继续发送GETNEXT操作。假如继续使用以前的会话,我们要依靠标志m_bNext,判断m_bNext的真假以决定是否继续发GETNEXT数据包。void CSnmpManagerDlg::OnRecv(){&收、处理消息if(m_bNext==TRUE)&&Next(m_sOid);}这样,我们就完成了对表格中一列的遍历。同样,我们可以完成对整个表格的遍历,我们只需strcmp(str.Left(18),"1.3.6.1.2.1.4.21.1"),就可以获得整个表格的结束。再在Next(LPTSTR Oid)函数中用switch-case语句按各个MIB变量的值分类,就可以得到整个表格。3.4.3& 对表格变量的SET操作在整个系统的开发中,我们曾经对SysName变量进行SET操作。证明是可行的。但当我们SET一个表格变量时,报告变量绑定(VB)错误,类型为bad value。可能有两个原因。(1). 代理进程(Agent)不支持对这些表格变量的SET操作。(具体见RFC1212)(2). 当SET一个表格变量时,我们应该对表格中的所有变量都赋值,并封装成一个PDU发出去。因为当我们用route add添加路由表时,必须指定所有的参数。并且,表格变量只允许添加与删除两种操作。 &}

我要回帖

更多关于 snmp 路由表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信