SNMP_PP_CHS Charpter 14

1.         The Variable Binding Class

SNMP++Variable Binding ( Vb)Class的对象模型(Object Modeling Technique)视图

Variable Binding ( Vb) class SNMP“绑定变量的封装。一个绑定变量是由SNMPobject ID及其SMIvalue组合而成的。用面向对象的概念来看,这只是一个简单的关联关系:一个Vb对象含有一个Oid对象及其SMIvalueVb class允许应用的开发者实例化Vb对象,然后为其分配Oid部分(用Vb::set_value()),并分配value部分(用Vb::get_value())。相反的,Oidvalue部分可以通过成员函数Vb::get_oid()Vb::get_value()提取出来。通过重载了的公有成员函数Vb::set_value()Vb::get_value(),可以把不同的SMIvalue针对绑定变量进行设置取出绑定变量表SNMP++中表现为Vb对象的数组。所有的SMI类型都与Vb Class兼容。Vb class隐藏了所有(内部)数据。使用者不需要知道SMIvalue的类型,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);

设置一个VbOid部分

    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部分初始化为(以参数方式)传进来的OidVb对象生成了一个传进来的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 ClassGet Oid / Set Oid成员函数

成员函数Get Oid / Set Oid允许获取/设置Vb对象的Oid部分。当SNMP发出gets或者sets操作的时候,变量的指定是通过Vb::set_oid( Oid oid).设置VbOid值来的。相反,Oid部分可以通过成员函数Vb::get_oid( Oid &oid)来获取。成员函数get_oidSNMPget 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 ClassGet Value / Set Value成员函数

成员函数get_valueset_value允许获取或设置Vb对象的value部分。这些成员函数通过重载支持对不同类型的获取和设置。隐藏了获取或设置Vb的内部机制, 管理了所有内存的分配和释放。这样,程序员就不用担心SMI-value的结构以及它们的管理。通常在SNMP执行了get(译注:后面将要讲到)后,用成员函数get value来获取Vb对象的value。如果希望在SNMP执行set操作时设置Vbvalue的话,成员函数set value就有用了。如果获取的valueVb所包含的不匹配,则成员函数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,该valueSMI 32 bit的映射。

// set the value with a 32 bit gauge

void Vb::set_value( const Gauge32 gauge);

Vb对象设置一TimeTicks对象作为value,该valueSMI timeticks的映射。

// set the value with a TimeTicks

void Vb::set_value( const TimeTicks timeticks);

Vb对象设置一Counter32对象作为value,该valueSMI 32 bit counter的映射。

// set value with a 32 bit counter

void Vb::set_value( const Counter32 counter);

Vb对象设置一Counter64对象作为value,该value用以构成SMI 64 bit counter32bit的高位部分与低位部分。

// 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位字符串作为SMIvalue部分,但是当它是一个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对象设置Vbvalue部分。该成员函数使用了Address classIP addressSMI value类型的一种。

// set an IPAddress object as a value

void Vb::set_value ( const IpAddress ipaddr);

用一个IPX address对象设置Vbvalue部分。该成员函数使用了Address classIPX address8SMI value类型的一种。

// set an IPXaddress object as a value

void Vb::set_value ( const IpxAddress ipxaddr);

用一个MAC address对象设置Vbvalue部分。该成员函数使用了Address classMAC address8SMI 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 classVb 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

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值