您的位置:首页 > 其它

SNMP_PP_CHS Charpter 13

2006-03-31 20:45 363 查看

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 class由4个子类组成:IpAddress Class, IpxAddress Class, MacAddress class和GenAddress 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.010a0d”; // invalid MAC address
printf(“%s”, (mac.valid() ? “Valid” :”Invalid”));

1.8. UdpAddresses和IpxSockAddresses

大多数时候,SNMP++的用户会使用默认的端口号和套接字来进行SNMP操作。就IP协议而言, 161端口(一般)用来作为代理的目标端口, 162端口(一般)用作trap和Notification的接收端口。有些时候需要改变指定的端口号和套接字,UdpAddress class和IpxSockAddress 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. 用UdpAddress和IpxSockAddress接收Notification

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

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 == ip2”;

if (ipx1 != ipx2)
cout << “ipx1 != ipx2”;

if ( mac1 <= mac2)
cout << “mac1 < mac2”;

//---------------[ modifying an address ]-----------------------------------------------------------
mac1[4] = 15;
cout << mac2[2];

}; // end address examples
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: