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
相关文章推荐
- SNMP_PP_CHS Charpter 10 - 12
- SNMP_PP_CHS Charpter 3 - 5
- SNMP_PP_CHS Charpter 6 - 7
- SNMP_PP_CHS Charpter 15
- SNMP_PP_CHS Charpter 8 - 9
- SNMP_PP_CHS Charpter 16 - 17
- SNMP_PP_CHS Charpter 18
- SNMP_PP_CHS Charpter 19 - 21
- SNMP_PP_CHS —— 中文版“snmp_pp.doc”序
- SNMP_PP和SNMPSharpNet的性能比较
- SNMP_PP_CHS Charpter 1 - 2
- SNMP_PP_CHS Charpter 14
- SNMP/MIB系列(13)--SNMPv3视图访问控制模型
- 在Windows下用VC编译SNMP++静态链接库snmp_pp.lib
- C++ Primer 读书笔记 Charpter 13 复制控制
- 在Windows下用VC编译SNMP++静态链接库snmp_pp.lib
- snmp_pp bug
- SNMP_PP和SNMPSharpNet的性能比较
- NET-SNMP的 asn 操作接口
- [2016/07/06] LeetCode / Java - Day 13 -