1. 程式人生 > >SNMP++2.8中文文件

SNMP++2.8中文文件

SNMP++

用C++構建的,處理簡單網路管理協議(SNMP)API


SNMP++框架的物件模型(

Object Modeling Technique)檢視

1. 介紹

目前有許多可以建立網路管理應用的SNMPAPI。大多數API都提供了一個很大的函式庫,呼叫這些函式的程式設計師需要熟悉SNMP內部的工作原理和它的資源管理機制。這些API大多都是平臺相關的,導致了SNMP的程式碼也成了作業系統相關的或者網路系統平臺有關的,難以移植。另一方面由於C++有豐富的、可複用的標準類庫,用C++開發應用成了目前的主流,然而C++標準類庫所缺少的正是一套封裝好的處理網路管理的類。如果基於面向物件的方法來進行SNMP網路程式設計,可以提供以下諸多好處:易用、安全、可移植、能擴充套件。因此SNMP++

靈活有效的解決了其他類似API執行和管理起來都很痛苦的問題。

1.1. 什麼是SNMP++

SNMP++是一套C++類的集合,它為網路管理應用的開發者提供了SNMP服務。SNMP++並非是現有的SNMP引擎的擴充或者封裝。事實上為了效率和方便移植,它只用到了現有的SNMP庫裡面極少的一部分。SNMP++也不是要取代其他已有的SNMP API,比如WinSNMPSNMP++只是通過提供強大靈活的功能,降低管理和執行的複雜性,把面向物件的優點帶到了網路程式設計中。

1.2. SNMP++的本質

1.2.1. 簡單易用的SNMP++

面向物件的SNMP程式設計應該是簡單易用的。畢竟,

SNMP原意就是簡單網路管理協議SNMP++只是將簡單還給SNMP!應用的開發者不需要關心SNMP的底層實現機制,因為面向物件的方法已經將SNMP內部機制封裝、並隱藏好了。SNMP++的簡單易用表現在以下方面:

1.2.1.1. 為SNMP提供了簡單易用的介面

使用SNMP++不需要精通SNMP,甚至不需要精通C++!因為SNMP++裡面幾乎沒有C的指標,所以可以簡單的通過API直接使用。

1.2.1.2. 可以方便的遷移至SNMPv2

SNMP++的主要目標之一就是開發一套API,使得遷移至SNMPv2的過程中儘可能少地影響現有程式碼。SnmpTarget class使之成為了可能。

1.2.1.3. 保留了對SNMP靈活的底層開發

這是為了方便那些不希望使用面向物件方法,而直接編寫SNMP的底層機制的使用者。雖然SNMP++快速而方便,但是有些時候程式設計師也許希望直接使用底層的SNMP API

1.2.1.4. 鼓勵程式設計師用功能強大的C++,不要因學得不夠快而去指責它

使用SNMP++的使用者不需要精通C++。基本的SNMP的知識是必要的,但是實際上也需要對C++初步的理解。

1.2.2. 程式設計安全的SNMP++

大多數SNMP API需要程式設計師去管理大量的資源。不恰當的裝載或解除安裝這些資源,會導致記憶體崩潰或洩漏。SNMP++提供的安全機制,可以實現對這些資源的自動管理。SNMP++的使用者可以體驗到自動管理資源與對話所帶來的好處。SNMP++在程式設計上的安全突出表現在下面的領域:

1.2.2.1. 為SNMP資源提供安全的管理

這包括對SNMP的結構、會話以及傳輸層的管理。SNMP class被設計成所謂的抽象資料型別(ADT),隱藏了私有資料,而通過提供公有的成員函式來訪問或修改這些隱藏了的例項變數。

1.2.2.2. 提供查錯、自動超時重發的機制

SNMP++的使用者不需要關心如何為不可靠的網路傳輸機制提供可靠性。可能出現的通訊錯誤包括:資料包丟失、資料包重複以及反覆提取資料包。SNMP++消除了所有這些問題出現的可能性,為使用者提供了傳輸層的可靠性。

1.2.3. 可移植的SNMP++

SNMP++的主要目的之一就是提供一套可移植的API,進而穿越各種作業系統(Os)、網路系統(NOS)以及網路管理平臺。由於SNMP++隱藏了內部機制,所以從各個平臺的角度來看SNMP++的公用介面都是一樣的。使用SNMP++的程式設計師不需要為平臺遷移去修改程式碼。另一個移植方面的問題是在多種協議上執行的能力。目前,SNMP++能執行在IP協議和IPX協議上,或者兩者都可以。

1.2.4. 可擴充的SNMP++

擴充不應該只是多一種選擇,而是更深層次的。SNMP++不僅是可擴充,而且是很容易擴充。SNMP++的擴充囊括了對下列領域的支援:新的作業系統、網路系統、網路管理平臺、網路協議、SNMPv2及其新特性。通過派生C++的類,SNMP++的使用者可以根據自己的喜好繼承、過載。

1.2.4.1. 過載SNMP++的基礎類

應用的開發者可以通過派生出SNNP++的子類來提供所需的操作和屬性,這正是面向物件的核心主題。SNMP++的基礎類被打造成通用的、沒有包含任何具體的資料結構和操作。通過C++派生類以及重新定義虛擬函式,可以很容易的新增新屬性。

2. 一個介紹性的例子

在開始介紹SNMP++的各種特性之前,這裡先舉個簡單的例子來展現它的強大和簡單。該例子是從指定的代理端上獲取SNMP MIB的系統描述符(System Descriptor object)。包含了建立一個SNMP++會話、獲取系統描述符,並列印顯示出來的所需的所有程式碼。其中重發和超時機制已經被SNMP++自動管理了。以下屬於SNMP++的程式碼,採用粗體顯示。

2.1. 一個簡單的SNMP++例子

#include “snmp_pp.h”

#define SYSDESCR “1.3.6.1.2.1.1.1.0” // Object ID for System Descriptor

void get_system_descriptor()

{

int status; // return status

CTarget ctarget( (IpAddress) “10.4.8.5”); // SNMP++ community target

Vb vb( SYSDESCR); // SNMP++ Variable Binding Object

Pdu pdu; // SNMP++ PDU

//-------[ Construct a SNMP++ SNMP Object ]---------------------------------------

Snmp snmp( status); // Create a SNMP++ session

if ( status != SNMP_CLASS_SUCCESS) { // check creation status

cout << snmp.error_msg( status); // if fail, print error string

return; }

//-------[ Invoke a SNMP++ Get ]-------------------------------------------------------

pdu += vb; // add the variable binding to the PDU

if ( (status = snmp.get( pdu, ctarget)) != SNMP_CLASS_SUCCESS)

cout << snmp.error_msg( status);

else {

pdu.get_vb( vb,0); // extract the variable binding from PDU

cout << “System Descriptor = ”<< vb.get_printable_value(); } // print out the value

}; // Thats all!

2.2. 對介紹性例子的分析

真正屬於SNMP++的語句就10行程式碼。首先用代理端的IP地址建立一個CTarget物件;然後用MIB物件所定位的系統描述符建立一個變數繫結(Vb);接著就把這個Vb納入一個Pdu物件;最後生成一個Snmp物件來執行SNMPget操作。一旦找到了所需的資料,對應的應答訊息就被打印出來。另外,所有的處理錯誤程式碼也都包含在內了。

3. SNMP++特性

3.1. 完整的一套SNMP C++

SNMP++是以一套C++類作為基石的。這些類是:物件描述符(Oid)類、變數繫結(Vb)類、協議資料單元(Pdu)類、Snmp類。並且,其他各種用抽象語法表示(ASN.1)來描述的管理資訊結構(SMI),也被抽象成了簡單的、面向物件的型別。

3.2. SNMP記憶體的自動管理

SNMP++的物件被例項化或銷燬的時候, 其相關的類可以自動管理著各種各樣的SNMP結構和資源。這就使得應用的開發者不用再擔心資料結構和資源的解除安裝,不然就得為防止記憶體的崩潰或者洩漏提供有效的保護措施。SNMP++的物件的例項化可以是靜態的,也可以是動態的。靜態的例項化可以在物件脫離它的作用域時解除安裝掉;動態分配則需要使用C++newdelete。在SNMP++內部,有許多被隱藏和保護在公用介面後面的SMI結構。所有的SMI結構都是在內部管理的,程式設計師不需要定義或管理SMI的結構和它的值。因為在SNMP++內絕大部分地方是不存在C的指標的。

3.3. 簡單易用的

由於隱藏並管理了所有SMI結構和它們的值,SNMP++的類使用起來即簡單又安全。外部程式設計師無法破壞到隱藏和保護在作用域後面的東東。

3.4. 強大靈活的

SNMP++提供了強大靈活的功能,降低了管理和執行的複雜性。每個SNMP++物件都通過建立一個會話來和一個代理端聯絡。即由一個SNMP++的對話類的例項,就能處理所有與特定代理端的連線。另外自動重發和超時控制的機制,為每個SNMP++物件都帶來了可靠性。一個應用可能會包含許多SNMP++的物件的例項,每個例項都可能與相同或不同的代理端通話。有了這個功能強大的特性,網路管理程式就可以為每個管理單元建立起不同的會話。另一方面,就算單一的SNMP會話也可以解決問題。例如:一個應用可以通過一個SNMP++物件來處理圖形統計,另一個SNMP++物件監控trap,也許還有第三個SNMP++物件用以瀏覽SNMPSNMP++自動並行處理了同一時刻來自不同SNMP++例項的請求。

3.5. 可移植物件的

SNMP++的主體是可以移植的C++程式碼。其中只有Snmp Class的實現與不同的目標作業系統有關。如果你的程式中包含了SNMP++的程式碼,那麼匯出這部分程式碼的時候,就可以不做任何修改。

3.6. 自動超時和重發機制

SNMP++提供了自動超時和重發機制,程式設計師不用去實現超時或重發機制的程式碼。重發機制是在SnmpTarget Class裡面定義的,這就使得每一個目標(Target)都具有了它自己的超時/重發機制。

3.7. 阻塞模式

SNMP++提供了阻塞方式。MS-Windows上的阻塞方式可以併發的阻塞從每個SNMP類的例項發出的請求。

3.8. 非同步的非阻塞模式

SNMP++還為應答提供了非同步的非阻塞的方式。超時和重發機制同時支援阻塞和非同步兩種模式。

3.9. Notification、Trap的收發

SNMP++允許在多種傳輸層上(包括IPIPX)收發trap。而且SNMP++還允許使用非標準的IP埠和IPX套介面來收發trap

3.10. 通過雙效的API支援SNMPv1SNMPv2

SNMP++的設計可同時支援SNMPv1SNMPv2的使用。所有API的操作都被設計成了雙效的,也即操作是SNMP版本無關的。通過使用SnmpTarget類,與SNMP的版本相關的操作被抽象出來了。

3.11. 支援SNMPGet, Get Next, Get Bulk, Set, InformTrap的操作

SNMP++完整的支援SNMP6種操作。這6SNMP++的成員函式使用相同的引數表,也都支援阻塞和非阻塞(非同步)方式。

3.12. 通過繼承實現重定義

SNMP++是用C++實現的,所以允許程式設計師過載或重定義那些不適合他們的操作。舉個例子:如果一個應用需要特定的Oid物件,那就需要建立一個Oid Class的子類,用以繼承所有Oid類的屬性和操作,同時在派生類種加入新的屬性和操作。

4. 在Microsoft Windows 系列作業系統上使用SNMP++

SNMP++已經在MS-Windows 3.1, MS-Windows For Work Groups 3.11, MS-Windows NT 3.51, and MS-Windows ’95上實現了。

4.1. WinSNMP Version 1.1的使用

MS-Windows上可以用WinSNMP Version 1.1來執行SNMP++。這就使得其他用WinSNMP程式碼直接寫的SNMP應用可以與SNMP++的應用相容。注意,目前HPMS-Windows裝置使用WinSNMP,其他裝置不需要使用WinSNMP來進行ANS.1的編碼和解碼。但那些沒有使用WinSNMP的裝置也需要與WinSNMP的應用相容,才能和SNMP++的應用相容。

4.2. 對IPIPX的支援

可以通過一個WinSock compliant stack,來實現對IP的操作。同時為了在IPX協議上執行,還需要相容Novell網路的客戶程式和驅動。目前SNMP++已經通過了在廣泛多樣的協議棧下的執行測試,這些協議棧包括:FTPNetmanageLanWorkPlaceMS-WFWG 3.11,以及Windows NT

4.3. 對NotificationTrap收發的支援

SNMP++ 包含了對WinSNMP trap機制的支援。這同時包括了trap的傳送和收取。在接收trap的時候,還提供了過濾trap的功能。

4.4. 與HP OpenView for Windows 相容

已經有大量使用SNMP++建立的應用,實現了HP OpenView for Windows的相容。

5. 在UNIX上使用SNMP++

5.1. 統一的類的介面

用在UNIX裝置上的SNMP++類的介面和MS-Windows是一樣的。

5.2. Windows到UNIX的模擬與移植

通過編譯、連線對應的SNMP++類,SNMP++就可以實現在UNIX上執行。SNMP++/UNIX的設計決定了它可以同時執行在原始的UNIX字元模式、X-Window模式,或者Windows-to-UNIX的模擬工具上。

5.3. 與HP OpenView for UNIX 相容

已經有大量使用SNMP++建立的應用,實現了與HP OpenView for UNIX的相容。

6. SNMP Syntax Classes

SNMP++SNMP Syntax的物件模型(Object Modeling Technique)檢視

SNMP++SNMP syntax classe描繪了一個具有C++面向物件風格的檢視。即用於描述SNMPSMIASN.1的資料型別檢視。它包含了對映到對應的SMI型別的一組類的集合。而且為了方便使用,還引入了一些非SMI的類。SNMP++為這些SNMP資料型別提供了強大、簡單易用的介面。下表概要地描述了各種SNMP++ syntax classes

SNMP++ Syntax Class Name

Class Description

SMI or ASN.1 Counter part

SnmpSyntax

Parent of all syntax classes.

No ASN.1 counter part, used for OO structure.

Oid

Object identifier class.

ASN.1 Object Identifier.

OctectStr

Octet string class.

ASN.1 Octet string.

Uint32

Unsigned 32 bit integer class.

SMI unsigned 32 bit integer.

TimeTicks

TimeTicks class.

SMI time ticks.

Counter32

32 bit counter class.

SMI 32 bit counter.

Gauge32

32 bit gauge class.

SMI 32 bit gauge.

Int32

Signed 32 bit integer.

SMI 32 bit signed integer.

Counter64

64 bit counter class.

SMI 64 bit counter.

Address

Abstract address class.

No ASN.1 counter part used for OO structure.

IpAddress

IP address class.

SMI IP address.

UdpAddress

UdpAddress class

SMI IP address with port specification.

IpxAddress

IPX address class.

No ASN.1 or SMI counter part

IpxSockAddress

IPX Address class with socket number.

No ASN.1 or SMI counter part

MacAddress

MAC address class.

SMI counter part

GenAddress

Generic Address

No ASN.1 or SMI counter part.

7. Object Id Class

SNMP++Oid Class的物件模型(Object Modeling Technique)檢視

7.1. 物件識別符號類

物件識別符號類(Oid)封裝了SMI的物件標識。資訊管理庫(MIB)中所定義的SMI的物件是一種在MIB中找到的資料元素的資料標識。與SMI Oid相關的結構和函式,自然都是面向物件的。事實上Oid classC++String class有許多共同之處。如果你熟悉C++String class或者MFCCString class,那麼你就會感覺Oid class用起來很親切、簡單。Oid class被設計成了快速有效的類;它可以定義和操作物件標識;不依賴現有的 SNMP API,完全是可移植的;可以在任何ANSI C++編譯器上進行編譯。

7.2. Oid Class的成員函式列表

Oid Class Member Functions

說明

Constructors

Oid::Oid( void);

構造一個空的的Oid

Oid::Oid( const char *dotted_string);

用帶點的字串構造新的Oid

Oid::Oid( const Oid &oid);

用已有的Oid構造新的Oid

Oid::Oid( const unsigned long *data, int len);

通過一個指標和長度來構造一個新的Oid

Destructor

Oid::~Oid( );

銷燬一個Oid,釋放所有的堆

Overloaded Operators

Oid & operator = ( const char *dotted_string);

將一個帶點的字串付給一個Oid

Oid & operator = ( const Oid &oid);

將一個Oid付給另一個Oid

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

判斷兩個Oid是否相等

int operator == ( const Oid& lhs, const char*dotted_string);

判斷一個Oid是否和一個帶點的字串相等

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

判斷兩個Oid是否不等

int operator != ( const Oid & lhs, const char *dotted_string);

判斷一個Oid是否和一個帶點的字串不相等

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

判斷一個Oid是否比另一個小

int operator < ( const Oid &lhs, const char *dotted_string);

判斷一個Oid是否比一個帶點的字串小

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

判斷一個Oid是否小於等於另一個

int operator <= ( const Oid &lhs, const char *dotted_string);

判斷一個Oid是否小於等於一個帶點的字串

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

判斷一個Oid是否比另一個大

int operator > ( const Oid &lhs, const char * dotted_string);

判斷一個Oid是否比一個帶點的字串大

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

判斷一個Oid是否大於等於另一個

int operator >= ( const Oid &lhs, const char* dotted_string);

判斷一個Oid是否大於等於一個帶點的字串

Oid& operator += ( const char *dotted_string);

將一個帶點的字串加到一個Oid後面

Oid& operator +=( const unsigned long i);

將一個整數加到一個帶點的Oid字串後面

Oid& operator+=( const Oid& oid);

將一個Oid加到另一個Oid後面

unsigned long &operator [ ] ( int position);

訪問Oid的一個獨立子單元

Output Member Functions

char * get_printable( const unsigned int n);

返回一個Oidn個帶點格式的子單元

char *get_printable( const unsigned long s, const unsigned long n);

返回從s開始,以點號分割的n個子單元

char *get_printable();

返回以點號分割的Oid字串

operator char *();

同上

Miscellaneous Member Functions

set_data (const unsigned long *data,const unsigned long n);

用指標和長度來設定一個Oid

unsigned long len( );

返回Oid中子單元的個數(長度)

trim( const unsigned long n=1);

刪除Oid最右邊的n個子單元,預設刪除1

nCompare( const unsigned long n, const Oid& oid);

從左至右比較Oid的前n個子單元

RnCompare( const unsigned long n, const Oid& oid);

從右至左比較Oid的後n個子單元

int valid( );

返回Oid的有效性

7.3. 一些Oid Class的例子

下面的例子展示了Oid Class的不同用法。Oid Class不需要依賴其他庫和模組。下列程式碼在ANSI/ISO C++上編譯通過

#include “oid.h”

void oid_example()

{

// construct an Oid with a dotted string and print it out

Oid o1("1.2.3.4.5.6.7.8.9.1");

cout << “o1= “ << o1.get_printable ();

// construct an Oid with another Oid and print it out

Oid o2(o1);

cout << “o2= ” << o2.get_printable();

// trim o2’s last value and print it out

o2.trim(1);

cout << “o2= ” << o2.get_printable();

// add a 2 value to the end of o2 and print it out

o2+=2;

cout << “o2= ” << o2.get_printable();

// create a new Oid, o3

Oid o3;

// assign o3 a value and print it out

o3="1.2.3.4.5.6.7.8.9.3";

cout << “o3= ” << o3.get_printable();

// create o4

Oid o4;

// assign o4 o1’s value

o4=o1;

// trim off o4 by 1

o4.trim(1);

// concat a 4 onto o4 and print it out

o4+=”.4”;

cout << “o4= ” << o4.get_printable();

// make o5 from o1 and print it out

Oid o5(o1);

cout << “o5= ” << o5.get_printable();

// compare two not equal oids

if (o1==o2) cout << "O1 EQUALS O2";

else cout << "o1 not equal to o2";

// print out a piece of o1

cout << "strval(3) of O1 = “ << o1.get_printable(3);

// print out a piece of o1

cout << "strval(1,3) of O1 = “ << o1.get_printable(1,3);

// set o1's last subid

o1[ o1.len()-1] = 49;

cout << "O1 modified = “ << o1.get_printable();

// set o1's 3rd subid

o1[2]=49;

cout << "O1 modified = “ << o1.get_printable();

// get the last subid of 02

cout << "last of o2 = “ << o2[o2.len()-1];

// get the 3rd subid of 02

cout << "3rd of o2 = “ << o2[2];

// ncompare

if (o1.nCompare(3,o2))

cout << "nCompare o1,o2,3 ==";

else

cout << "nCompare o1,o2,3 !=";

// make an array of oids

Oid oids[30]; int w;

for ( w=0;w<30;w++)

{

oids[w] = "300.301.302.303.304.305.306.307";

oids[w] += (w+1);

}

for (w=0;w<25;w++)

{

sprintf( msg,"Oids[%d] = %s",w, oids[w].get_printable());

printf(“%s”,msg, strlen(msg));

}

}

8. OctetStr Class

SNMP++OctetStr Class的物件模型(Object Modeling Technique)檢視

8.1. 八位位元組類

通過SNMP++Octet class,可以簡單且安全地操作SMI8位位元組。有了Octet class,就不需要通過內部指標和長度來操作8位位元組了。使用SNMP++Octet class來例項化、操作、銷燬一個8位位元組物件是很簡單的,不用擔心如何管理記憶體以及記憶體是否會洩漏。與ANSI C++string class類似,OctetStr class可以通過多種方法構造8位位元組,還可以對它們進行賦值操作,與其他SNMP++ classes一起使用。

8.2. OctetStr Class的成員函式列表

OctetStr Class Member Functions

說明

Constructors

OctetStr::OctetStr( void);

構造一個空的OctetStr

OctetStr::OctetStr( const char* string);

用一個沒有結束符的字串構造OctetStr

OctetStr::OctetStr( const unsigned char *s, unsigned long int i);

通過一個指標和長度來構造OctetStr

OctetStr::OctetStr( const OctetStr &octet);

用已有的OctetStr構造新的OctetStr

Destructor

OctetStr::~OctetStr( );

銷燬一個OctetStr

Overloaded Operators

OctetStr& operator = ( const char *string);

將一個沒有結束符的字串付給一個OctetStr

OctetStr& operator = ( const OctetStr& octet);

將一個OctetStr付給另一個OctetStr

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

判斷兩個OctetStr物件是否相等

int operator == ( const OctetStr & lhs, const char *string);

判斷OctetStr是否和一個char*字串相等

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

判斷兩個OctetStr物件是否不相等

int operator != ( const OctetStr& lhs, const char *string);

判斷OctetStr是否和一個char*字串不相等

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

判斷一個OctetStr是否比另一個小

int operator < ( const OctetStr &lhs, const char * string);

判斷一個OctetStr是否比另一個char *字串小

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

判斷一個OctetStr是否小於等於另一個

int operator <= ( const OctetStr &lhs, const char * string);

判斷一個OctetStr是否小於等於一個char *的字串

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

判斷一個OctetStr是否比另一個大

int operator > ( const OctetStr& lhs, const char * string);

Test if one OctetStr is greater than a char *.

判斷一個OctetStr是否比一個char *的字串大

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

判斷一個OctetStr是否大於等於另一個

int operator >= ( const OctetStr& lhs, const char *);

判斷一個OctetStr是否大於等於一個char*的字串

OctetStr& operator +=( const char * string);

在一個OctetStr後面連線一個字串

OctetStr& operator +=( const unsigned char c);

在一個OctetStr後面連線一個單字元

OctetStr& operator+=( const OctetStr &octetstr);

將兩個OctetStr連線在一起

unsigned char& operator[ ] ( int position i);

用陣列的形式來訪問一個OctetStr

Miscellaneous

void set_data( const unsigned char *s, unsigned long l);

用指標和長度來設定一個OctetStr

int nCompare( const unsigned long n, const OctetStr &o);

與另一個OctetStr比較前n個元素

unsigned long len();

返回一個OctetStr的長度

int valid();

返回一個OctetStr的有效性

unsigned char * data();

返回一個指向內部資料的指標

char * get_printable();

格式化輸出,如果不是ASCII則按16進位制處理

char * get_printable_hex();

16進位制格式,進行格式化輸出

8.3. 注意

當輸出一個OctetStr物件時,如果該8位位元組所包含的字元不是ASCII碼,對成員函式char *或者get_printable()的呼叫,就會自動轉換成對成員函式get_printable_hex()的呼叫。這就使得使用者只需要簡單地使用成員函式char *get_printable()來進行輸出。而成員函式get_printable_hex()是專門用來把OctetStr16進位制格式輸出的。

8.4. 一些OctetStr Class的例子

// Octet Class Examples

#include “octet.h”

void octet_example()

{

OctetStr octet1; // create an invalid un- initialized octet object

OctetStr octet2( “Red Hook Extra Bitter Ale”); // create an octet with a string

OctetStr octet3( octet2); // create an octet with another octet

unsigned char raw_data[50]; // create some raw data

OctetStr octet4( raw_data, 50); // create an OctetStr using unsigned char data

octet1 = “Sierra Nevada Pale Ale”; // assign one octet to another

cout << octet1.get_printable(); // show octet1 as a null terminated string

cout << octet4.get_printable_hex(); // show octet4 as a hex string

cout << (char *) octet1; // same as get_printable()

if ( octet1 == octet2) // compare two octets

cout << “octet1 is equal