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对象。版本可以是SNMPv1或2。返回错误状态。 |
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。一个target在SNMP通讯中,可以想象成一个代理端的管理层的概念,它由多个网络地址组成。Targets包含了重发和超时机制的信息,还有SNMP协议类型(即SNMPv1和SNMPv2)等等。目前已有的Targets唯一的子类是Community-based CTarget。CTarget class可用在SNMPv1和SNMPv2的通讯上,由此可以重用你已有的代码到SNMPv2通讯中,不需要做修改。通过它,还可以使得一个SNMP++会话与某个特定的代理端的属性无关。
2.1. 抽象的Target
SNMP++支持抽象Target的概念。由该(抽象)Target可以操作所有实际的Target派生类。所有使用Target的SNMP++成员函数接收的都是抽象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=1,time_out=1。 |
CTarget::CTarget(const Address &address , const char *read_community_name, const char *write_community_name, | 用community names和Address object构造一个CTarget。重发机制的默认值:retry=1,time-out =100ms。 |
CTarget( const Address &address const OctetStr &read_community_name, const OctetStr &write_community_name); | 用OctetStr Communities和Address构造一个CTarget |
CTarget::CTarget( Address &address); | 用Address object构造一个CTarget。重发机制的默认值:community names =“public”, retry=1,time_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版本(version1或version2) |
void set_version( const snmp_version v); | 设置版本(version1或version2) |
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为基础的访问(方式),即SNMPv1或SNMPv2。
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”);