SNMP_PP_CHS Charpter 13

1.         Address Class

SNMP++Address Class的对象模型(Object Modeling Technique)视图

1.1.        什么是网络地址类?

网络地址类是一组C++类的集合,它提供了简单、安全、可移植、高效地使用网络地址的方法。许多网络管理应用需要通过网络地址来访问和管理设备,包括地址的确认、更改,以及用户接口的分配。Address class不但管理了所有指定的网络地址的内部细节,而且还通过封装和隐藏(其内部)机制,让得到解放的开发应用的程序员可以专注于解决实际问题。开发Address class(的动机)来源于95 Interop SNMP++ Birds-of-A-Feather (BOF)上的讨论以及与Hewlett-Packard OpenView程序员的交流。

1.2.        为什么要使用网络地址类?

地址类提供了以下好处:自动内存管理、地址确认、移植到任何C++环境、简单易用,及可扩充性。目前的Address class4个子类组成:IpAddress Class, IpxAddress Class, MacAddress classGenAddress class。将来(也许)会有其他的子类加入,比如IP Next Generation (IPng)

1.3.        Address class

所有地址类都派生自同一个抽象基类:Address class。它是一个抽象类,(即)这个类不会产生实例对象。Address class通过使用虚成员函数,提供了公用接口。也就是说可以使用公用接口调用各个不同地址类的函数。这样的结果是:当需要修改使用了地址类的模块时,需要改动的代码就很少了。

1.4.        Address Classes及其接口

作为基类的Address Classes是一个抽象类,它囊括了所有子类的通用操作。(也即)包含了以下统一的接口:构造、访问、修改地址。


Address Class Member Functions

Description

IpAddress Class Constructors

 

      IpAddress::IpAddress( void);

构造一个空的IpAddress对象

      IpAddress::IpAddress( const char *string);

用一个字符串构造一个IpAddress,当需要时一般用到DNS

      IpAddress::IpAddress( const IpAddress &ipa);

拷贝构造函数

IPAddress Member Functions  

 

      char * friendly_name( int & status);

DNS的名字看起来更友好

UdpAddress Constructors  

 

     UdpAddress::UdpAddress( void);

构造一个无效的UdpAddress对象

     UdpAddress::UdpAddress( const char *string);

用一个字符串构造一个UdpAddress

     UdpAddress::UdpAddress( const UdpAddress &udpa);

用一个已有的UdpAddress来构造另一个

UdpAddress Member Functions

 

     void UdpAddress:set_port( const unsigned int p);

设置UdpAddress对象的端口号

     unsigned int UdpAddress::get_port();

获取UdpAddress对象的端口号

IpxAddress Class Constructors 

 

      IpxAddress::IpxAddress( void);

构造一个空的IPX地址

      IpxAddress::IpxAddress( const char *string);

用一个字符串构造一个IPX地址

      IpxAddress::IpxAddress( const IpxAddress &ipxa);

拷贝构造函数

IpxSockAddress Constuctors

 

     IpxSockAddress::IpxSockAddress( void);

构造一个空的IpxSockAddress对象

     IpxSockAddress::IpxSockAddress( const char *string);

用一个字符串构造一个IpxSockAddress

     IpxSockAddress::IpxSockAddress( const IpxSockAddress &ipxs);                                                   

用一个已有的IpxSockAddress来构造另一个

IpxSockAddress Member Functions

 

     IpxSockAddress::set_socket( const unsigned int s);

从一个IpxSockAddress获得套接字

     unsigned int IpxSocketAddress::get_socket();

设置一个IpxSockAddress的套接字

MacAddress Constructors

 

      MacAddress::MacAddress( void);

构造一个空的MacAddress对象

      MacAddress::MacAddress( const char * string);   

用一个字符串构造一个MacAddress

      MacAddress::MacAddress( const MacAddress &mac);

拷贝构造函数

GenAddress Constructors

 

     GenAddress::GenAddress( void);

构造一个无效的GenAddress对象

     GenAddress::GenAddress( const char * addr);

用一个字符串构造一个GenAddress

     GenAddress::GenAddress( const GenAddress &addr);

拷贝构造函数

Common Member Functions, applicable to all Address classes

 

      int operator == ( const Address &lhs, const Address rhs);

判断两个地址是否相等

      int operator != ( const Address &lhs, const Address &rhs);

判断两个地址是否不相等

      int operator > ( const Address &lhs, const Address &rhs);

判断一个地址是否大于另一个

      int operator >= (const Address &lhs, const Address &rhs);

判断一个地址是否大于等于另一个

      int operator < ( const Address &lhs, const Address &rhs);

判断一个地址是否小于另一个

      int operator<=( const Address &lhs, const Address &rhs);

判断一个地址是否小于等于另一个

      int operator == ( const Address &lhs, cosnt char *inaddr);

判断一个地址是否等于一个字符串

      int operator > ( const Address &lhs, const char *inaddr);

判断一个地址是否大于一个字符串

      int operator < ( const Address &lhs, const char *inaddr);

判断一个地址是否小于一个字符串

      virtual int valid( );     

判断一个地址的有效性

      unsigned char& operator[]( int position);

允许通过数组的下标操作符来访问一个地址

      char * get_printable ( );

返回格式化输出的地址

1.5.        IpAddress Class的特点

IpAddress Class可以通过调用成员函数Address::get_printable()自动以DNS显示(出来)。如果没有激活DNS或者无法识别地址,则返回以点号分割的字符。另一方面,一个IpAddress可以用一个友好的名字(译注:字符串,而非以点号分割的数字)来构造,这样构造函数就可以激活DNS的显示。如果这个名字没被找到,那么该地址也就是无效的。这个强大的功能允许你在对外表现时,使用友好的名字方式。

1.6.        GenAddress的特点

GenAddress class允许创建和使用通用的地址,(即)GenAddress拥有其他地址类(IpAddress, IpxAddress MacAddress)的操作和属性,(所以)你可以使用GenAddress来操作任何地址。GenAddress class的构造函数允许用任何字符串来建立一个地址。构造函数通过匹配的字符串以及加载在GenAddress上的属性与操作,决定其地址的具体类型。这样就解放了程序员,因为面对不一样的地址,程序员不用再专门写代码来处理了。

GenAddress Examples

 

GenAddress address1(“ 10.4.8 .5”);    // make an IP GenAddress

GenAddress address2(“01020304-10111213141516”);    // make an IPX GenAddress

GenAddress address3(“01:02:03:04:05: 06” );    // make a MAC GenAddress

 

cout << address3.get_printable();    // print out the GenAddress

 

if ( !address1.valid())                                                            // check validity

    cout << “address1 ! valid”;

1.7.        Address Class的有效性

所有地址类都支持成员函数::valid(),它可以返回指定地址对象的有效性。有效性是在构造或给一个地址对象赋值时决定的。只有在赋值之后,成员函数::valid()才可以被用来判断其有效性。

Address Class Validation Examples

 

MacAddress mac;

mac = “ 01.010a 0d”;                                      // invalid MAC address

printf(“%s”, (mac.valid() ? “Valid” :”Invalid”));

1.8.        UdpAddressesIpxSockAddresses

大多数时候,SNMP++的用户会使用默认的端口号和套接字来进行SNMP操作。就IP协议而言, 161端口(一般)用来作为代理的目标端口, 162端口(一般)用作trapNotification的接收端口。有些时候需要改变指定的端口号和套接字,UdpAddress classIpxSockAddress class就允许定义端口和套接字的信息。

1.8.1.       UdpAddresses发送请求

当向一个使用非标准默认端口的代理端发送请求信息时,就需要用到UdpAddresses class了。UdpAddresses class提供了两个成员函数分别来设置和获取自定义的端口信息。用一个加载了UdpAddresses的目标来发送请求,就可以实现SNMP++对自定义端口的使用。

1.8.2.       IpxSockAddresses发送请求

当向一个使用非标准默认IPX套接字的代理端发送请求信息时,就需要用到IpxSockAddresses class了。IpxSockAddresses提供了两个成员函数分别来设置和获取自定义的IPX套接字信息。用一个加载了IpxSockAddress的目标来发送请求,就可以实现SNMP++对自定义套接字的使用。

1.8.3.       UdpAddressIpxSockAddress接收Notification

UdpAddressIpxSockAddress还可以通过指定需要修改的端口和套接字来接收notification。(即)允许应用通过非标准的端口和套接字来接收trapinform

1.9.        有效的地址格式

目前的有效地址格式定义如下:

 

Valid IP format BNF Grammar XXX.XXX.XXX.XXX

ip-address : ip-token DOT ip-token DOT ip-token DOT ip-token

DOT : ‘.’

ip-token : [0-255]

 

Valid IPX format BNF GrammarXXXXXXXX:XXXXXXXXXXXX

ipx-address: net-id SEPARATOR mac-id

SEPARATOR : ‘ ‘ | ‘:’ | ‘-’ | ‘.’

net_id : 1{byte-token}4

mac-id: 1{byte-token}6

byte-token: 1{byte}2

byte: [0-9|a-f|A-F]

 

Valid MAC format BNF Grammar XX:XX:XX:XX:XX:XX

mac-id: byte_token colon byte_token colon byte_token colon byte_token colon byte_token

byte-token: 1{byte}2

byte: [0-9|a-f|A-F]

colon: ‘:’

1.10.     Address Class例子

// address class examples

#include “address.h”

void address_examples()

{

   //--------------[ IPAddress construction ]------------------------------------------------------

   IpAddress ip1();                                // makes an invalid IpAddress object

   IpAddress ip2(“ 10.4.8 .5”);                         // makes a IpAddress verifies dotted format

   IpAddress ip3(ip2);                                 // makes an IpAddress using another IpAddress

   IpAddress ip4(“trout.rose.hp.com”);        // makes an IpAddress does DNS on string

 

   //-------------[ IPX Address construction ]-----------------------------------------------------

   IpxAddress ipx1();                                                        // makes an invalid IPX address

   IpxAddress ipx2(”);                                // makes and verifies an IPX address

   IpxAddress ipx3( ipx2);                                                // makes an IPX from another IPX

 

   //--------------[ MAC Address construction ]-----------------------------------------------------

   MacAddress mac1();                                                  // makes an invalid MAC address

   MacAddress mac2(“08:09:12:34:52: 12” );                // makes and verifies a MAC address

   MacAddress mac3( mac2);                                        // makes a MAC from another MAC

 

  //---------------[ Gen Address Construction ]-----------------------------------------------------

  GenAddress addr1(“ 10.4.8 .5”);

  GenAddress addr2(“01020304: 050607080900” );

 

   //--------------[ printing addresses ]----------------------------------------------------------------

   cout << (char *) ip2;

   cout << (char *) ipx2;

   cout << (char *) mac2;

 

   //---------------[ assigning Addresses ]------------------------------------------------------------

   ip1 = “ 15.29.33 .10”;

   ipx1 = “00000001 -080912345212” ;

   mac1 = “08:09:12:34:52: 12” ;

 

   //--------------[ comparing Addresses ]----------------------------------------------------------

   if ( ip1 == ip2)

       cout << “ip1 == ip 2” ;

 

   if (ipx1 != ipx2)

      cout << “ipx1 != ipx 2” ;

 

   if ( mac1 <= mac2)

      cout << “mac1 < mac 2” ;

 

//---------------[ modifying an address ]-----------------------------------------------------------

   mac1[4] = 15;

   cout << mac2[2];

  

 

};  // end address examples


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值