SNMP_PP_CHS Charpter 16 - 17

1.         SnmpMessage Class

SnmpMessage Class允许对SNMP++对象使用抽象编码规则(ASN.1)和基础编码规则(BER)来编码和解码,进而生成可以在线路上传送的SNMP消息。该class可以方便的串行化Pdu对象,以便于后期的各种使用。大多数SNMP++的用户不需要使用这个类,因为Snmp class已经完成了这项任务,包括管理超时和重发。但是如果程序员想对消息编码,这里也为其提供一种选择,例如很多代理系统就在使用它们自己的传输层。SnmpMessage class提供的各种成员函数如下表所示:

SnmpMessage Class Member Functions

Description

Constructors

 

     SnmpMessage::SnmpMessage( void);

构造一个空的SnmpMessage对象

Member Functions

 

     int load( Pdu pdu, OctetStr community,

                     snmp_version version);

Pdu、团体名、版本加载一个SnmpMessage对象。版本可以是SNMPv12。返回错误状态。

     int load( unsigned char * data, unsigned long en);

用原始数据流加载一个SnmpMessage对象。当从线路上收取数据报并通过把它加载到一个SnmpMessage对象来实现解码时,该函数很有用。

     int unload( Pdu &pdu, OctetStr &community,

                       snmp_version &version);

卸载一个已经加载过的SnmpMessage对象。由此可以获得Pdu、团体名、版本

     unsigned char * data();

通过原始的ASN.1/BER串行化数据缓冲区。该缓冲区的范围可以通过成员函数::len()获得

     unsigned long len()

返回原始数据缓冲区的范围

      int valid();

判断一个SnmpMessage对象的有效性


2.         Target Class

Target class是一个C++类,在SNMP++中用它来定义和使用target。一个targetSNMP通讯中,可以想象成一个代理端的管理层的概念,它由多个网络地址组成。Targets包含了重发和超时机制的信息,还有SNMP协议类型(即SNMPv1SNMPv2)等等。目前已有的Targets唯一的子类是Community-based CTargetCTarget class可用在SNMPv1SNMPv2的通讯上,由此可以重用你已有的代码到SNMPv2通讯中,不需要做修改。通过它,还可以使得一个SNMP++会话与某个特定的代理端的属性无关。

2.1.        抽象的Target

SNMP++支持抽象Target的概念。由该(抽象)Target可以操作所有实际的Target派生类。所有使用TargetSNMP++成员函数接收的都是抽象Target,而不是特指的派生Target对象。当需要支持新的Target时,这种抽象的接口可以减小代码的改动。

2.2.        Target地址

每个target都与一个地址对象(Address object)相关联。该地址是一个GenAddress,因此可以处理所有SNMP++地址(IP, IPX或其他)。为指明被管理的代理端地址并与一个Target相关联,(只需要)简单地通过构造函数的参数或成员函数(就可实现)。

2.3.        重发机制

每个Target都具有重发机制,(在该机制中)定义了超时和重发。(由该重发机制)可指定等待一个SNMP应答的周期,以及当没有收到一个SNMP应答时进行多少次重发。超时(的最小单位)被定义成百分之一秒,即当取值为100代表每个应答等待1秒。重发时记录了重发的次数,(注意)第一次请求不属于重发,只是发送。所以重发值取3,表示当等待一个应答时最多可以重发3次。等待的总时间可以用下列式子计算:Total Wait Time = time-out  * (retry+1)

如果一个SNMP++应答没有在(上式)所计算出来的等待总时间内到来,将会返回一个SNMP++超时的错误号。该操作在阻塞和异步两种调用中(都可)使用。

2.4.        Target Class接口

Target Class Member Functions

Description

Constructors

 

     CTarget::CTarget( void);

构造一个无效的CTarget。重发机制的默认值:community names “public” retry=1time_out=1

     CTarget::CTarget(const Address &address ,

                    const char *read_community_name,  

                    const char *write_community_name, 

community namesAddress object构造一个CTarget。重发机制的默认值:retry=1time-out =100ms

     CTarget( const Address &address

                    const OctetStr &read_community_name,

                    const OctetStr &write_community_name);

OctetStr CommunitiesAddress构造一个CTarget

     CTarget::CTarget( Address &address);

Address object构造一个CTarget。重发机制的默认值:community names “public” retry=1time_out=1

     CTarget::CTarget( const CTarget &target);

拷贝构造函数

Destructor

 

     CTarget::~CTarget();

删除CTarget对象,释放所有资源。

Member Functions

 

     char * get_readcommunity();

返回读(权限)的community名称

     void get_readcommunity( OctetStr& read_community_oct);

获取OctetStr格式的读(权限)community

     void set_readcommunity( const char * get_community);

设置读(权限)community

     void set_readcommunity( const OctetStr& read_community);

用一个OctetStr设置读(权限)community

     char * get_writecommunity();

获取写(权限)community

     void get_writecommunity( OctetStr &write_community_oct);

获取OctetStr格式的写(权限)community

     void set_writecommunity( const char * new_set_community);

设置写(权限)community

     void set_writecommunity( const OctetStr& write_community);

 

用一个OctetStr设置写(权限)community

     int  get_address( GenAddress &address);

获取Address object.

     void set_address( Address &address);

设置Address部分

     CTarget& operator=( const CTarget& target);

把一个CTarget赋给另一个。

     snmp_version get_version();

返回SNMP版本(version1version2

     void set_version( const snmp_version v);

设置版本(version1version2

     int operator==( const CTarget &lhs, const CTarget &rhs);

比较两个CTargets

Abstract Class Member Functions

 

     int valid();

返回一个Target的有效性

     void set_retry( const int r);

设置重发值

     int get_retry();

获取重发值

     void set_timeout( const unsigned long t);

设置超时值

     unsigned long get_timeout();

获取超时值

2.5.        CTarget Class (Community为基础的Target)

CTarget class允许显示地定义以Community为基础的Target。一个CTarget用以SNMP Community为基础的Target定义了一个SNMP代理端。这包含了读(权限)、写(权限)community names and an address。地址是用SNMP++ Address class来表示的,所以该地址可以是IP或者IPX address(译注:Address class是个抽象基类,所以可以实现多态操作)。CTarget class使用前提应该是:应用开发者明确地知道代理端所支持的以SNMP community为基础的访问(方式),即SNMPv1SNMPv2

2.5.1.       CTarget对象(可通过)3种不同的方式构建

// ----------[ instantiating CTarget Objects ]-----------------------------

 

// valid complete instantiation

CTarget    ct((IpAddress)”10.10.10.10”,  // Address

                      “public”,                              // read community name

                      “public”);                            // write community name

 

// valid complete using “public” defaults

CTarget ct( (IpAddress) “1.2.3.4”);

 

// invalid CTarget

CTarget ct;

2.5.2.       修改CTargets

//----[ modifying CTargets ]------------------------------------

ct.set_readcommunity(“private);   // modifying the read community

 

ct.set_writecommunity(“private”);  // modifying the write community

 

ct.set_address( (IpAddress) “15.29.33.210”);

2.5.3.       访问CTargets

//-----[ Accessing CTarget member variables ]-------------------------

 

// get the write community name

cout << “Write community” << ct.get_writecommunity(); 

 

// get the read community name

cout << “Read community ” << ct.get_readcommunity();

 

// get the address

GenAddress address;

ct.get_address( address);

 

// check the validity of a target

if ( ct.valid())

   cout << “Target is valid”;

2.5.4.       CTargets例子

//------------[CTarget class examples ]-----------------------------------------------------------------

 

// create a valid CTarget using a GenAddress

CTarget ct( (GenAddress) “10.20.30.40”);

 

// create a valid CTarget using an IpxAddress

IpxAddress ipxaddress(“01010101-010101010101”);

CTarget my_target( ipxaddress);                          // use default “public” for communities

 

// create an invalid CTarget object

CTarget  ct;                                                      // no construction params therefor invalid

if ( !ct.valid()) 

   cout << “Invalid CTarget instance!”;

 

// get the read community

cout << “Read Community =” << ct.get_readcommunity();

 

// get the write community

cout << “Write Community = ” << ct.get_writecommunity();

 

// modify the get community

ct.set_readcommunity( “pilsner”);

 

// modify the write community

ct.set_writecommunity(“pale ale”);


你可能感兴趣的:(云的SNMP++)