1. The Variable Binding Class
SNMP++之Variable Binding ( Vb)Class的对象模型(Object Modeling Technique)视图
Variable Binding ( Vb) class 是SNMP“绑定变量”的封装。一个“绑定变量”是由SNMP的object ID及其SMI的value组合而成的。用面向对象的概念来看,这只是一个简单的关联关系:一个Vb对象含有一个Oid对象及其SMI的value。Vb class允许应用的开发者实例化Vb对象,然后为其分配Oid部分(用Vb::set_value()),并分配value部分(用Vb::get_value())。相反的,Oid和value部分可以通过成员函数Vb::get_oid()和Vb::get_value()提取出来。通过重载了的公有成员函数Vb::set_value()和Vb::get_value(),可以把不同的SMI的value针对“绑定变量”进行“设置”与“取出”。“绑定变量表”在SNMP++中表现为Vb对象的数组。所有的SMI类型都与Vb Class兼容。Vb class隐藏了所有(内部)数据。使用者不需要知道SMI的value的类型,Oid的内部表示方法,以及其他SNMP相关的结构。如果使用的是标准ANSI C++编译器,Vb class是完全可移植的。
1.1. Variable Binding Class成员函数列表
Variable Binding Class Member Functions | Description |
Constructors |
|
Vb( void); | 构造一个空的Vb对象 |
Vb( const Oid &oid); | 用Oid部分构造一个Vb |
Vb( const Vb &vb); | 拷贝构造函数 |
Destructor |
|
~Vb(); | 销毁一个Vb,释放所有的资源 |
Set Oid / Get Oid |
|
void set_oid( const Oid &oid); | 设置一个Vb的Oid部分 |
void get_oid( Oid &oid) const; | 获得Oid部分 |
Set Value |
|
void set_value( const SMIValue &val); | 设置任一SmiValue |
void set_value( const int i); | 设置一整形value |
void set_value( const long int i); | 设置一长整形value |
void set_value( const unsigned long int i); | 设置一无符号长整形value |
void set_value( const char WINFAR * ptr); | 设置一有结束标志符的字符串value |
Get Value |
|
int get_value( SMIValue &val); | 获得任一SmiValue |
int get_value( int &i); | 获得一整形value |
int get_value( long int &i); | 获得一长整形value |
int get_value( unsigned long int &i); | 获得一无符号长整形value |
int get_value( unsigned char WINFAR * ptr, unsigned long &len); | 获得一无符号字符数组,返回数据及其长度 |
int get_value( unsigned char WINFAR * ptr, unsigned long &len, unsigned long maxlen); | 获得一指定长度的无符号字符数组,指定长度不超过最大长度。 |
int get_value( char WINFAR *ptr); | 获得一有结束标志符的字符串 |
Miscellaneous |
|
SmiUINT32 get_syntax(); | 返回SMI描述 |
char *get_printable_value(); | 返回格式化value |
char *get_printable_oid(); | 返回格式化Oid部分 |
void set_null(); | 给Vb对象设置一个空value |
int valid(); | 返回一个Vb的有效性 |
Overloaded Operators |
|
Vb& operator=( const Vb &vb); | 把一个Vb付给另一个 |
1.2. Vb Class的公有成员函数
Vb class提供了许多公有成员函数来访问和修改Vb对象。
// A Vb object may be constructed with no arguments. In this case, the Oid and
// value portions must be set with subsequent member function calls.
// constructor with no arguments
// makes an Vb, un-initialized
Vb::Vb( void);
1.2.1. Vb Class的构造和析构函数
Vb对象可以用一个Oid对象作为构造函数的参数来构造,(即)把Vb对象的Oid部分初始化为(以参数方式)传进来的Oid。Vb对象生成了一个传进来的Oid的拷贝,所以程序员不用担心Oid参数的执行期(问题)。
// constructor to initialize the Oid
// makes a Vb with Oid portion initialized
Vb::Vb( const Oid oid);
Vb对象的析构函数释放了所有占用过的内存和资源。对于定义的静态对象,析构函数是在对象作用域结束时自动调用的。动态分配的实例对象需要用delete来析构。
// destructor
// if the Vb has a Oid or an octet string then
// the associated memory needs to be freed
Vb::~Vb();
1.2.2. Vb Class的Get Oid / Set Oid成员函数
成员函数Get Oid / Set Oid允许获取/设置Vb对象的Oid部分。当SNMP发出gets或者sets操作的时候,变量的指定是通过Vb::set_oid( Oid oid).设置Vb的Oid值来的。相反,Oid部分可以通过成员函数Vb::get_oid( Oid &oid)来获取。成员函数get_oid在SNMP的get next(译注:后面将要讲到)操作中的非常有用。
Vb对象的Oid部分可以用一个已存在的Oid对象来设置
// set value Oid only with another Oid
void Vb::set_oid( const Oid &oid);
Oid部分可以通过提供一个目标Oid对象来检索。这将销毁原先的Oid对象的值。
// get Oid portion
void Vb::get_oid( Oid &oid);
1.2.3. Vb Class的Get Value / Set Value成员函数
成员函数get_value,set_value允许获取或设置Vb对象的value部分。这些成员函数通过重载支持对不同类型的获取和设置。隐藏了获取或设置Vb的内部机制, 管理了所有内存的分配和释放。这样,程序员就不用担心SMI-value的结构以及它们的管理。通常在SNMP执行了get(译注:后面将要讲到)后,用成员函数get value来获取Vb对象的value。如果希望在SNMP执行set操作时设置Vb的value的话,成员函数set value就有用了。如果获取的value与Vb所包含的不匹配,则成员函数get_value返回-1。
向Vb对象设置一整形value,作为SMI INT的映射。
// set the value with an int
void Vb::set_value( const int i);
向Vb对象设置一长整形value,作为SMI INT32的映射。
// set the value with a long signed int
void Vb::set_value( const long int i);
向Vb对象设置一无符号长整形value,作为SMI UNIT32的映射。
// set the value with an unsigned long int
void Vb::set_value( const unsigned long int i);
向Vb对象设置一Gauge32对象作为value,该value是SMI 32 bit的映射。
// set the value with a 32 bit gauge
void Vb::set_value( const Gauge32 gauge);
向Vb对象设置一TimeTicks对象作为value,该value是SMI timeticks的映射。
// set the value with a TimeTicks
void Vb::set_value( const TimeTicks timeticks);
向Vb对象设置一Counter32对象作为value,该value是SMI 32 bit counter的映射。
// set value with a 32 bit counter
void Vb::set_value( const Counter32 counter);
向Vb对象设置一Counter64对象作为value,该value用以构成SMI 64 bit counter的32bit的高位部分与低位部分。
// set value to a 64 bit counter
void Vb::set_value( const Counter 64 c 64);
用一个Oid设置Vb对象的value部分。
// set value for setting an Oid
// creates own space for an Oid which
// needs to be freed when destroyed
void Vb::set_value( const Oid &varoid);
用一个char型的字符串设置一个Vb对象的value部分。事实上,这在内部是用8位字符串作为SMI的value部分,但是当它是一个ASCII字符串(比如系统标识符)时,这种表示却会显得更简单。
// set value on a string
// makes the string an octet
// this must be a null terminates string
void Vb::set_value( const char * ptr);
用一个IP address对象设置Vb的value部分。该成员函数使用了Address class。IP address是SMI value类型的一种。
// set an IPAddress object as a value
void Vb::set_value ( const IpAddress ipaddr);
用一个IPX address对象设置Vb的value部分。该成员函数使用了Address class。IPX address是8位SMI value类型的一种。
// set an IPXaddress object as a value
void Vb::set_value ( const IpxAddress ipxaddr);
用一个MAC address对象设置Vb的value部分。该成员函数使用了Address class。MAC address是8位SMI value类型的一种。
// set an MAC address object as a value
void Vb::set_value ( const MacAddress macaddr);
1.2.4. 用一个GenAdress对象设置value
// set an GenAddress object as a value
void Vb::set_value ( const GenAddress genaddr);
1.2.5. 用一个UdpAdress对象设置value
// set an UdpAddress object as a value
void Vb::set_value ( const UdpAddress udpaddr);
1.2.6. 用一个IpxSockAdress对象设置value
// set an IpxSockAddress object as a value
void Vb::set_value ( const IpxSockAddress ipxsockaddr);
1.2.7. 用一个Octet对象设置value部分
// set the value portion to a SNMP++ Octet object
void Vb::set_value( const OctetStr octet);
1.2.8. Vb Class成员函数:Get Value
所有的成员函数Vb::get_value都会修改传进来的参数。如果一个Vb对象不包含被请求的参数类型,该参数不会被修改,并且将返回SNMP_CLASS_INVALID。否则,如果成功将会返回SNMP_CLASS_SUCCESS的状态。
从Vb对象获得一个整形value
// get value int
// returns 0 on success and value
int Vb::get_value( int &i);
从Vb对象获得一个长整形value
// get the signed long int
int Vb::get_value( long int &i);
从Vb对象获得一个无符号长整形value
// get the unsigned long int
int Vb::get_value( unsigned long int &i);
// get a Gauge32 int Vb::get_value( Gauge32 &gauge); |
从Vb对象获得一个Gauge32
从Vb对象获得一个TimeTicks
// get a TimeTicks from a Vb
int Vb:get_value( TimeTicks &timeticks);
从Vb对象获得一个Counter32
// get a counter from a Vb
int Vb::get_value(Counter32 &counter);
从Vb对象获得一个64 bit counter
// get a 64 bit counter
int Vb::get_value( Counter64 &counter64);
从Vb对象获得一个Oid对象
// get the Oid value
// free the existing Oid value
// copy in the new Oid value
int Vb::get_value( Oid &varoid);
从Vb对象获得一个无符号char型字符串(Octet string)
// get a unsigned char string value
// destructive, copies into given ptr of up
// to len length
int Vb::get_value( unsigned char * ptr, unsigned long &len);
从Vb对象获得一个char型字符串。该操作获得octet string部分,并在其后加一空值。
// get a char * from an octet string
// the user must provide space or
// memory will be stepped on
int Vb::get_value( char *ptr);
从Vb对象获得一个IP address对象。IP address是一种Address对象。
// get an IPAddress
int Vb::get_value( IpAddress &ipaddr);
从Vb对象获得一个IPX Address对象。IpxAddress是一种Address对象。
// get an IPXAddress
int Vb::get_value( IpxAddress &ipxaddr);
从Vb对象获得一个MAC Address对象。MacAddress是一种Address对象。
// get an MAC address
int Vb::get_value( MacAddress &MACaddr);
从Vb对象获得一个GenAddress对象。GenAddress是一种Address对象。
// get an gen address
int Vb::get_value( GenAddress &genaddr);
从Vb对象获得一个UdpAddress对象。UdpAddress是一种Address对象
// get an Udp address
int Vb::get_value( UdpAddress &Udpaddr);
从Vb对象获得一个IpxSockAddress对象。IpxSockAddress是一种Address对象
// get an IpxSockAddress
int Vb::get_value( IpxSockAddress &IpxSockAddr);
从Vb对象获得一个Octet对象
// get an Octet object from a Vb
int Vb::get_value( OctetStr, &octet);
1.2.9. Vb 对象的成员函数:Get Syntax
该函数并未遵循面向对象规则。如果要知道对象代表的事物,可以通过该函数返回对象(内部)的id,但同时也破坏了(内部)数据的隐藏。如果不考虑数据隐藏的话,有些时候可能还是需要知道Vb(内部)的value,以便抽取出那些隐藏的value。比如,当实现一个浏览器时需要获取Vb,询问Vb有什么数据并取出Vb包含的数据。该操作所返回的syntax values就是SMI syntax value。
// return the current syntax
// This method violates the OO paradigm but may be useful if
// the caller has a Vb object and does not know what it is.
// This would be useful in the implementation of a browser.
SmiUINT32 get_syntax();
1.2.10. 检查Vb对象的有效性
通过调用成员函数Vb::valid()可以检查一个Vb对象的实例的有效性。有效的Vb是那些已经获得了Oid的。
// determine if a Vb object is valid
int Vb::valid();
1.2.11. 把Vb对象付给另一个Vb对象
通过重载赋值操作符“=”,Vb对象可以相互赋值。这种简单的相互赋值避免以下操作:查询一个Vb对象的内容,然后手工将其赋给(另一个)目标Vb对象。
// overloaded Vb assignment
// assignment to another Vb object overloaded
Vb& operator=( const &Vb vb);
1.2.12. Vb对象的错误信息
当用Vb::get_value()从一个Vb对象获取数据时,由于Vb数据类型与你所请求的数据类型的不一致将导致一个错误的出现。例如,假设一个Vb对象有一个OctetStr对象,你却要求提取TimeTicks对象。由于无法返回TimeTicks ,Vb::get_value()会失败。当错误事件发生时,相应的调用模块使用Vb::get_syntax()来询问Vb的实际值或者错误值。
Vb::get_value() return value | Description |
SNMP_CLASS_SUCCESS | 成功,返回所请求的值 |
SNMP_CLASS_INVALID | 失败,Vb value没有包含请求的值 |
1.3. Vb Class例子
下面的例子展示了使用Vb class的不同方法。除了Oid class,Vb class不需要依赖于其他库或模块。以下C++代码是ANSI兼容的。
#include “oid.h”
#include “vb.h”
vb_test()
{
// -------[Ways to construct Vb objects ]-------
// construct a single Vb object
Vb vb1;
// construct a Vb object with an Oid object
// this sets the Oid portion of the Vb
Oid d1(“ 1.3.6 .1. 4.12” );
Vb vb2(d1);
// construct a Vb object with a dotted string
Vb vb3( (Oid) “ 1.2.3 .4. 5.6” );
// construct an array of ten Vbs
Vb vbs[10];
//------[Ways to set and get the Oid portion of Vb objects ]
// set and get the Oid portion
Oid d2((Oid)“ 1.2.3 .4. 5.6” );
vb1.set_oid(d2);
Oid d3;
vb1.get_oid(d3);
if (d2==d3) cout << “They better be equal!!/n”;
Vb ten_vbs[10];
int z;
for (z=0;z<10;z++)
ten_vbs[0].set_oid((Oid)“ 1.2.3 . 4.5” );
//-------[ ways to set and get values ]
// set & get ints
int x,y;
x=5;
vb1.set_value(x);
vb1.get_value(y);
if ( x == y) cout << “x equals y/n”;
// set and get long ints
long int a,b;
a=100;
//-------[ ways to set and get values ]
if ( a == b) cout << “a equals b/n”;
// set & get unsigned long ints
unsigned long int c,d;
c = 1000;
vbs[0].set_value( c); vbs[0].get_value( d);
if ( c == d) cout << “c equals d/n”;
// set a 64 bit counter
Counter 64 c 64(1000,1001);
vbs[1].set_value( c64);
// get and set an oid as a value
Oid o1, o2;
o1 = “ 1.2.3 .4. 5.6” ;
vbs[2].set_value( o1); vbs[2].get_value( o2);
if ( o1 == o2) cout << “o1 equals o2/n”;
// set and get an octet string
unsigned char data[4],outdata[4];
unsigned long len,outlen;
len =4; data[0] = 10; data[1] = 12; data[2] = 12; data[3] = 13;
OctetStr octetstr(data,len);
vbs[3].set_value( octetstr);
vbs[3].get_value( octetstr);
// get & set a string
char beer[80]; char good_beer[80];
strcpy( beer,”Sierra Nevada Pale Ale”);
vbs[4].set_value( beer);
vbs[4].get_value( good_beer);
printf(“Good Beer = %s/n”,good_beer);
// get and set an ip an address
IpAddress ipaddress1, ipaddress2;
ipaddress1 = “ 10.4.8 .5”;
vbs[5].set_value( ipaddress1);
vbs[5].get_value( ipaddress2);
cout << ipaddress2;
} // end vb example