SNMP++2.8中文文件
SNMP++
用C++構建的,處理簡單網路管理協議(SNMP)的API
SNMP++框架的物件模型(
1. 介紹
目前有許多可以建立網路管理應用的SNMP的API。大多數API都提供了一個很大的函式庫,呼叫這些函式的程式設計師需要熟悉SNMP內部的工作原理和它的資源管理機制。這些API大多都是平臺相關的,導致了SNMP的程式碼也成了作業系統相關的或者網路系統平臺有關的,難以移植。另一方面由於C++有豐富的、可複用的標準類庫,用C++開發應用成了目前的主流,然而C++標準類庫所缺少的正是一套封裝好的處理網路管理的類。如果基於面向物件的方法來進行SNMP網路程式設計,可以提供以下諸多好處:易用、安全、可移植、能擴充套件。因此SNMP++
1.1. 什麼是SNMP++
SNMP++是一套C++類的集合,它為網路管理應用的開發者提供了SNMP服務。SNMP++並非是現有的SNMP引擎的擴充或者封裝。事實上為了效率和方便移植,它只用到了現有的SNMP庫裡面極少的一部分。SNMP++也不是要取代其他已有的SNMP API,比如WinSNMP。SNMP++只是通過提供強大靈活的功能,降低管理和執行的複雜性,把面向物件的優點帶到了網路程式設計中。
1.2. SNMP++的本質
1.2.1. 簡單易用的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物件來執行SNMP的get操作。一旦找到了所需的資料,對應的應答訊息就被打印出來。另外,所有的處理錯誤程式碼也都包含在內了。
3. SNMP++特性
3.1. 完整的一套SNMP C++類
SNMP++是以一套C++類作為基石的。這些類是:物件描述符(Oid)類、變數繫結(Vb)類、協議資料單元(Pdu)類、Snmp類。並且,其他各種用抽象語法表示(ASN.1)來描述的管理資訊結構(SMI),也被抽象成了簡單的、面向物件的型別。
3.2. SNMP記憶體的自動管理
當SNMP++的物件被例項化或銷燬的時候, 其相關的類可以自動管理著各種各樣的SNMP結構和資源。這就使得應用的開發者不用再擔心資料結構和資源的解除安裝,不然就得為防止記憶體的崩潰或者洩漏提供有效的保護措施。SNMP++的物件的例項化可以是靜態的,也可以是動態的。靜態的例項化可以在物件脫離它的作用域時解除安裝掉;動態分配則需要使用C++的new和delete。在SNMP++內部,有許多被隱藏和保護在公用介面後面的SMI結構。所有的SMI結構都是在內部管理的,程式設計師不需要定義或管理SMI的結構和它的值。因為在SNMP++內絕大部分地方是不存在C的指標的。
3.3. 簡單易用的
由於隱藏並管理了所有SMI結構和它們的值,SNMP++的類使用起來即簡單又安全。外部程式設計師無法破壞到隱藏和保護在作用域後面的東東。
3.4. 強大靈活的
SNMP++提供了強大靈活的功能,降低了管理和執行的複雜性。每個SNMP++物件都通過建立一個會話來和一個代理端聯絡。即由一個SNMP++的對話類的例項,就能處理所有與特定代理端的連線。另外自動重發和超時控制的機制,為每個SNMP++物件都帶來了可靠性。一個應用可能會包含許多SNMP++的物件的例項,每個例項都可能與相同或不同的代理端通話。有了這個功能強大的特性,網路管理程式就可以為每個管理單元建立起不同的會話。另一方面,就算單一的SNMP會話也可以解決問題。例如:一個應用可以通過一個SNMP++物件來處理圖形統計,另一個SNMP++物件監控trap,也許還有第三個SNMP++物件用以瀏覽SNMP。SNMP++自動並行處理了同一時刻來自不同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++允許在多種傳輸層上(包括IP和IPX)收發trap。而且SNMP++還允許使用非標準的IP埠和IPX套介面來收發trap。
3.10. 通過雙效的API支援SNMPv1和SNMPv2
SNMP++的設計可同時支援SNMPv1和SNMPv2的使用。所有API的操作都被設計成了雙效的,也即操作是SNMP版本無關的。通過使用SnmpTarget類,與SNMP的版本相關的操作被抽象出來了。
3.11. 支援SNMP的Get, Get Next, Get Bulk, Set, Inform和Trap的操作
SNMP++完整的支援SNMP的6種操作。這6個SNMP++的成員函式使用相同的引數表,也都支援阻塞和非阻塞(非同步)方式。
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++的應用相容。注意,目前HP的MS-Windows裝置使用WinSNMP,其他裝置不需要使用WinSNMP來進行ANS.1的編碼和解碼。但那些沒有使用WinSNMP的裝置也需要與WinSNMP的應用相容,才能和SNMP++的應用相容。
4.2. 對IP和IPX的支援
可以通過一個WinSock compliant stack,來實現對IP的操作。同時為了在IPX協議上執行,還需要相容Novell網路的客戶程式和驅動。目前SNMP++已經通過了在廣泛多樣的協議棧下的執行測試,這些協議棧包括:FTP,Netmanage,LanWorkPlace,MS-WFWG 3.11,以及Windows NT。
4.3. 對Notification、Trap收發的支援
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++面向物件風格的檢視。即用於描述SNMP的SMI之ASN.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 class與C++的String class有許多共同之處。如果你熟悉C++的String class或者MFC的CString 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); |
返回一個Oid的n個帶點格式的子單元 |
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,可以簡單且安全地操作SMI的8位位元組。有了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()是專門用來把OctetStr按16進位制格式輸出的。
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 |