SNMP
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”);