用C++构建的,处理简单网罗管理协议(SNMP)的 API
这是篇描述SNMP++的文档。面向对象的SNMP++是一套专注于网络管理的开放技术,是SNMP协议原理和C++(结合的产物)。该文档描述了各种各样可移植的C++类(Class),正是这些C++类构建了SNMP++。(同时包含的)还有这些类的相关的许多例子。
(您可以)登录http://rosegarden.external.hp.com/snmp++,下载SNMP++的源码,和一些正在实际中使用的例子,以及其他相关文档。
(目前)有许多可以创建网络管理应用的SNMP的API。大多数API都提供了一个很大的函数库,(调用)这些函数的程序员需要熟悉SNMP内部的工作原理和它的资源管理(机制)。这些API大多都是平台相关的,导致了SNMP的代码成了操作系统相关的或者网络系统平台有关的,难以移植。(另一方面)由于C++有丰富的、可复用的标准类库,用C++开发应用成了目前的主流,(然而)C++标准类库所缺少的正是一套封装好的处理网络管理的类。(如果)基于面向对象的方法来进行SNMP网络编程,可以提供诸多好处:易用、安全、可移植、能扩展。(因此)SNMP++灵活有效的解决了其他类似API执行和管理起来都很痛苦的问题。
SNMP++是一套C++类的集合,它为网络管理应用的开发者提供了SNMP服务。SNMP++并非是现有的SNMP引擎的扩充或者封装。(事实上)为了效率和方便移植,它只用到了现有的SNMP库里面极少的一部分。SNMP++也不是要取代其他已有的SNMP API,比如WinSNMP。SNMP++(只是)通过提供强大灵活的功能,降低管理和执行的复杂性,把面向对象的优点带到了网络编程中。
面向对象的SNMP编程应该是简单易用的。毕竟,SNMP原意就是“简单网络管理协议”,SNMP++(只是)将简单还给SNMP!应用的开发者不需要关心SNMP的底层实现机制,因为面向对象的方法已经将SNMP内部机制封装、并隐藏好了。SNMP++的简单易用表现在以下方面:
使用SNMP++不需要精通SNMP,甚至不需要精通C++!因为SNMP++里面几乎没有C的指针,所以可以简单的通过API直接使用。
SNMP++的主要目标之一就是开发一套API,(使得)迁移至SNMPv2(的过程中)尽可能少地影响现有代码。SnmpTarget class(译注:后面将要讲到)使之成为了可能。
这是为了方便那些不希望使用面向对象方法,而直接编写SNMP的底层机制的用户。虽然SNMP++快速而方便,但是有些时候程序员也许希望直接使用底层的SNMP API。
使用SNMP++的用户不需要精通C++。基本的SNMP的知识是必要的,但是实际上也需要对C++初步的理解。
大多数SNMP API需要程序员去管理大量的资源。不恰当的装载或卸载这些资源,会导致内存崩溃或泄漏。SNMP++提供的安全机制,(可以)实现对这些资源的自动管理。SNMP++的用户(可以)体验到自动管理资源与对话所带来的好处。SNMP++在编程上的安全突出表现在下面的领域:
这包括对SNMP的结构、会话以及传输层的管理。SNMP class被设计成所谓的抽象数据类型(ADTs),隐藏了私有数据,而通过提供公有的成员函数来访问或修改这些隐藏了的实例变量。
SNMP++的用户不需要关心如何为不可靠的网络传输机制提供可靠性。可能出现的通信错误包括:数据包丢失、数据包重复以及反复提取数据包。SNMP++消除了所有这些问题出现的可能性,为用户提供了传输层的可靠性。
SNMP++的主要目的之一就是提供一套可移植的API,进而穿越各种操作系统(Oss)、网络系统(NOSs)以及网络管理平台。由于SNMP++隐藏了内部机制,所以从各个平台的(角度)来看SNMP++的公用接口都是都是一样的。使用SNMP++的程序员不需要为平台迁移去修改代码。另一个移植方面的问题是在多种协议上运行的能力。(对此)SNMP++现在能运行在IP协议和IPX协议上,或者两者都可以。
扩充不(应该)只是多一种选择,而是更深层次的。SNMP++不仅是可扩充,而且是很容易扩充。SNMP++的扩充囊括了对下列领域的支持:新的操作系统、网络系统、网络管理平台、网络协议、SNMPv2及其新特性。通过派生C++的类,SNMP++的用户可以根据自己的喜好继承、重载。
应用的开发者可以通过派生出SNNP++的子类来提供所需的操作和属性,这正是面向对象的核心主题。SNMP++的基础类被打造成通用的,而没有包含任何具体的数据结构和操作。通过C++派生类以及重新定义虚函数,可以很容易的添加新属性。
在开始介绍SNMP++的各种特性之前,这里先举个简单的例子来展现它的强大和简单。这个例子是从指定的代理端上获取SNMP MIB的系统描述符(System Descriptor object)。包含了创建一个SNMP++会话、获取系统描述符,并打印显示出来的所需的所有代码。(其中)重发和超时机制已经被SNMP++自动管理了。(以下)属于SNMP++的代码,采用粗体显示。
#include “snmp_pp.h” #define SYSDESCR “1.3.6.1.2.1.1.1.0” // Object ID for System Descriptor void get_system_descriptor() { int status; // return status CTarget ctarget( (IpAddress) “10.4.8.5”); // SNMP++ community target Vb vb( SYSDESCR); // SNMP++ Variable Binding Object Pdu pdu; // SNMP++ PDU
//-------[ Construct a SNMP++ SNMP Object ]--------------------------------------- Snmp snmp( status); // Create a SNMP++ session if ( status != SNMP_CLASS_SUCCESS) { // check creation status cout << snmp.error_msg( status); // if fail, print error string return; }
//-------[ Invoke a SNMP++ Get ]------------------------------------------------------- pdu += vb; // add the variable binding to the PDU if ( (status = snmp.get( pdu, ctarget)) != SNMP_CLASS_SUCCESS) cout << snmp.error_msg( status); else { pdu.get_vb( vb,0); // extract the variable binding from PDU cout << “System Descriptor = ”<< vb.get_printable_value(); } // print out the value
}; // Thats all! |
真正属于SNMP++的语句就10行代码。(首先)用代理端的IP地址建立一个CTarget对象;(然后)用MIB对象所定位的系统描述符创建一个变量绑定(Vb);(接着就把)这个Vb纳入一个Pdu对象;(最后生成)一个Snmp对象来执行SNMP的get操作。一旦找到了(所需的数据),(对应的)应答消息就被打印出来。(并且)所有的错误处理代码也都包含了。