1. Pdu Class
SNMP++之Pdu Class的对象模型(Object Modeling Technique)视图
|
SNMP++的Pdu class是SMI Protocol Data Unit (PDU)的C++封装。PDU是管理端和代理端进行SNMP通讯的基本概念。通过Pdu class,SNMP++使得对PDU的操作变得简单、安全。Pdu class允许简单的构造、析构,以及在Pdu对象上加载、卸载Vb对象。因为SNMP++是双效的API,所以Pdu class也是抽象化的,并没有包含SNMPv1或者SNMPv2的特征性的信息。所有发出请求的Snmp class成员函数都可以只使用一个Pdu对象。Pdu class作为Snmp class的接口,处理SNMP请求,同时还可作为异步请求和接收notification的回调函数的参数。注意,关于对Vb的存储,Pdu对象是从0开始的(Pdu中第一个vb是Vb #0)。
大多数地方,SNMP++中的所有Pdu对象都是一样的。即,所有的Pdu对象都有同一性(identity)。唯一的例外是当Pdu对象被用作发送otifications , traps和informs的时候。为了(支持)notifications,有3个附加的Pdu Class成员函数来用作:设置同一性(identity)、时间信息,及Pdu对象的enterprise。
1.1. Pdu Class成员函数列表
Pdu Class Member Functions | Description |
Constructors |
|
Pdu::Pdu( void); | 构造一个空的Pdu |
Pdu::Pdu( Vb* pvbs, const int pvb_count); | 用一个数组类型的Vb及其长度构造一个Pdu |
Pdu::Pdu( const Pdu &pdu); | 用一个Pdu构造另一个 |
Member Functions |
|
int get_vblist( Vb* pvbs, const int pvb_count); | 把Vb拷贝到调用的参数列表中(vblist) |
int set_vblist( Vb* pvbs, const int pvb_count); | 设置Pdu调用的参数列表中的Vb |
int get_vb( Vb &vb, const int index); | 获取Pdu中一个指定的Vb |
int set_vb( Vb &vb, const int index); | 为Pdu设置一个指定的Vb |
int get_vb_count(); | 获取Pdu中Vb的个数 |
int get_error_status(); | 获取Pdu的错误状态 |
int get_error_index(); | 获取Pdu的错误索引 |
unsigned long get_request_id(); | 获取Pdu的请求标示 |
unsigned short get_type(); | 获取Pdu的类型 |
int valid(); | 判断Pdu的有效性 |
Int delete_vb( const int position); | 删除Pdu指定位置上的Vb |
int trim(const int i=1); | 删除Pud最后位置上的Vb,默认删除1个 |
Member Functions For Inform and Trap Usage |
|
void set_notify_timestamp( const TimeTicks & timestamp); | 为trap或inform的Pdu设置时间信息 |
void get_notify_timestamp( TimeTicks & timestamp); | 从trap或inform的Pdu获取时间信息 |
void set_notify_id( const Oid id); | 设置trap或inform的Pdu的ID |
void get_notify_id( Oid &id); | 获取trap或inform的Pdu的ID |
void set_notify_enterprise( const Oid &enterprise); | 设置trap或inform的Pdu的enterprise ID |
void get_notify_enterprise( Oid & enterprise); | 获取trap或inform的Pdu的enterprise ID |
Overloaded Operators 重载操作符 |
|
Pdu& operator=( const Pdu &pdu); | 将一个Pdu付给另一个 |
Pdu& operator+=( Vb &vb); | 给一个Pdu增加一个Vb |
1.2. Pdu Class的构造和析构
有多种方法构造Pdu对象,可以有也可以没有构造参数
// constructor, no args
Pdu::Pdu( void);
// constructor with Vbs and count
Pdu::Pdu( Vb *vbs, const int vb_count);
// constructor with another Pdu instance
Pdu::Pdu( const Pdu &pdu);
// destructor
Pdu::~Pdu();
1.3. 访问Pdu的成员函数
Pdu class通过多种成员函数来支持获取和设置Pdu成员变量。包括获取和设置“绑定变量”、错误信息、请求信息,和类型信息。
// extract all the Vbs from a Pdu
int Pdu::get_vblist( Vb* vbs, const int vb_count);
// deposit Vbs to a Pdu
int Pdu::set_vblist( Vb* vbs, const int vb_count);
// get a particular vb
// where index 0 is the 1st vb
int Pdu::get_vb( Vb &vb, const int index);
// set a particular Vb
// where index 0 is the 1st Vb
int Pdu::set_vb( Vb &vb, const int index);
// return the number of Vbs
int Pdu::get_vb_count();
// return the error index
int Pdu::get_error_index();
// get the error status
int Pdu::get_error_status();
// return the request id
unsigned long Pdu::get_request_id();
// get the Pdu type
unsigned short Pdu::get_type();
// return the validity of a Pdu
int Pdu::valid();
1.4. Pdu Class重载操作符
Pdu class可通过重载操作符,赋值或串连Vb对象到Pdu。
// assignment operator for assigning one Pdu to another
Pdu& operator=( const Pdu &pdu);
// append a Vb object to the Pdu’s var bind list
Pdy& operator+=( Vb vb);
1.5. Pdu Class处理Traps和Informs的成员函数
当处理notifications, traps和informs的时候,SNMP++提供了成员函数来获取和设置指定的notification value。当使用这些成员函数时,请查阅发送traps和informs的部分。
// set notify timestamp
void Pdu::set_notify_timestamp( const TimeTicks & timestamp);
// get notify timestamp
void Pdu::get_notify_timestamp( TimeTicks & timestamp);
// set the notify id
void Pdu::set_notify_id( const Oid id);
// get the notify id
void Pdu::get_notify_id( Oid &id);
// set the notify enterprise
void Pdu::set_notify_enterprise( const Oid &enterprise);
// get the notify enterprise
void Pdu::get_notify_enterprise( Oid & enterprise);
1.6. 加载Pdu对象
为了在管理应用中使用Pdu对象,必须在Pdu实例中加载“绑定变量表”(vblist)。这可以通过从多种方法中选择你需要的来处理。一般在发送SNMP请求前加载Pdu。
// set notify timestamp
void Pdu::set_notify_timestamp( const TimeTicks & timestamp);
// get notify timestamp
void Pdu::get_notify_timestamp( TimeTicks & timestamp);
// set the notify id
void Pdu::set_notify_id( const Oid id);
// get the notify id
void Pdu::get_notify_id( Oid &id);
// set the notify enterprise
void Pdu::set_notify_enterprise( const Oid &enterprise);
// get the notify enterprise
void Pdu::get_notify_enterprise( Oid & enterprise);
1.7. 加载Pdu对象
为了在管理应用中使用Pdu对象,必须在Pdu实例中加载“绑定变量表”(vblist)。这可以通过从多种方法中选择你需要的来处理。一般在发送SNMP请求前加载Pdu。
// example of how to load a Pdu object
void load_pdu_examples()
{
Pdu pdu; // create a Pdu object
Vb vb; // create a Vb object
vb.set_oid( SYSDECR); // set the oid portion of the Vb to System Descriptor
pdu += vb; // loads the Vb to the Pdu
Pdu my_pdu; // create another Pdu object
Vb vbs[5]; // create 5 vbs
pdu.set_vblist( vbs,5); // load all 5 to the pdu
}
1.8. 卸载Pdu对象
从阻塞或异步请求中得到请求的Pdu后,都需要将Vb卸载下来才能把SMI values取出。
// example of how to unload a Pdu
void unload_pdu_example( Pdu &pdu)
{
ins staus;
Pdu pdu; // create a Pdu object
Vb vb; // create a Vb object
vb.set_oid( SYSDECR); // set the oid portion of the Vb to System Descriptor
pdu += vb; // loads the Vb to the Pdu
char message[100]; // for the system descriptor printable octet
Snmp snmp( status);
if ( status != SNMP_CLASS_SUCCESS) {
cout < “SNMP++ error = “ << snmp.error_msg( status) ;
return;
}
pdu.get_vb( vb,0); // unload the vb
vb.get_value( message); // pull the message out of the vb
cout << message; // print it out
};