




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、這是篇描述snmp+ 的文檔。面向?qū)ο蟮膕nmp+ 是一套專注于網(wǎng)絡(luò)管理的開放技術(shù),是 snmp 協(xié)議原理和c+(結(jié)合的產(chǎn)物) 。 該文檔描述了各種各樣可移植的c+類 (class) ,正是這些 c+類構(gòu)建了snmp+ 。(同時(shí)包含的)還有這些類的相關(guān)的許多例子。(您可以)登錄http:/ ,下載 snmp+ 的源碼,和一些正在實(shí)際中使用的例子,以及其他相關(guān)文檔。1.介紹(目前)有許多可以創(chuàng)建網(wǎng)絡(luò)管理應(yīng)用的snmp 的 api 。大多數(shù) api 都提供了一個(gè)很大的函數(shù)庫(kù),(調(diào)用)這些函數(shù)的程序員需要熟悉snmp 內(nèi)部的工作原理和它的資源管理(機(jī)制)。這些api 大多都是平臺(tái)相關(guān)的,導(dǎo)致了snm
2、p 的代碼成了操作系統(tǒng)相關(guān)的或者網(wǎng)絡(luò)系統(tǒng)平臺(tái)有關(guān)的,難以移植。(另一方面)由于c+有豐富的、可復(fù)用的標(biāo)準(zhǔn)類庫(kù),用c+開發(fā)應(yīng)用成了目前的主流,(然而)c+標(biāo)準(zhǔn)類庫(kù)所缺少的正是一套封裝好的處理網(wǎng)絡(luò)管理的類。(如果)基于面向?qū)ο蟮姆椒▉?lái)進(jìn)行snmp 網(wǎng)絡(luò)編程,可以提供諸多好處:易用、安全、可移植、能擴(kuò)展。(因此) snmp+ 靈活有效的解決了其他類似api 執(zhí)行和管理起來(lái)都很痛苦的問(wèn)題。1.1.什么是 snmp+snmp+ 是一套 c+類的集合,它為網(wǎng)絡(luò)管理應(yīng)用的開發(fā)者提供了snmp 服務(wù)。 snmp+并非是現(xiàn)有的snmp 引擎的擴(kuò)充或者封裝。(事實(shí)上)為了效率和方便移植,它只用到了現(xiàn)有的snmp
3、庫(kù)里面極少的一部分。snmp+ 也不是要取代其他已有的snmp api,比如 winsnmp 。snmp+ (只是)通過(guò) 提供強(qiáng)大靈活的功能,降低管理和執(zhí)行的復(fù)雜性,把面向?qū)ο蟮膬?yōu)點(diǎn)帶到了網(wǎng)絡(luò)編程中。1.2.snmp+ 的本質(zhì)1.2.1.簡(jiǎn)單易用的snmp+面向?qū)ο蟮膕nmp 編程應(yīng)該是簡(jiǎn)單易用的。畢竟,snmp 原意就是 “ 簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議” ,snmp+(只是) 將簡(jiǎn)單還給snmp!應(yīng)用的開發(fā)者不需要關(guān)心snmp 的底層實(shí)現(xiàn)機(jī)制,因?yàn)槊嫦驅(qū)ο蟮姆椒ㄒ呀?jīng)將snmp 內(nèi)部機(jī)制封裝、并隱藏好了。snmp+ 的簡(jiǎn)單易用表現(xiàn)在以下方面:.為 snmp 提供了簡(jiǎn)單易用的接口使用 snm
4、p+ 不需要精通snmp,甚至不需要精通c+!因?yàn)?snmp+ 里面幾乎沒有c 的指針,所以可以簡(jiǎn)單的通過(guò)api 直接使用。.可以方便的遷移至snmpv2snmp+ 的主要目標(biāo)之一就是開發(fā)一套api,(使得)遷移至snmpv2(的過(guò)程中)盡可能少地影響現(xiàn)有代碼。snmptarget class(譯注:后面將要講到)使之成為了可能。.保留了對(duì)snmp 靈活的底層開發(fā)這是為了方便那些不希望使用面向?qū)ο蠓椒?,而直接編寫snmp 的底層機(jī)制的用戶。雖然 snmp+ 快速而方便,但是有些時(shí)候程序員也許希望直接使用底層的snmp api。.鼓勵(lì)程序員用功能強(qiáng)大的c
5、+,不要因?qū)W得不夠快而去指責(zé)它使用 snmp+ 的用戶不需要精通c+?;镜?snmp 的知識(shí)是必要的,但是實(shí)際上也需要對(duì) c+初步的理解。1.2.2.編程安全的snmp+大多數(shù) snmp api 需要程序員去管理大量的資源。不恰當(dāng)?shù)难b載或卸載這些資源,會(huì)導(dǎo)致內(nèi)存崩潰或泄漏。snmp+ 提供的安全機(jī)制,(可以)實(shí)現(xiàn)對(duì)這些資源的自動(dòng)管理。snmp+ 的用戶(可以)體驗(yàn)到自動(dòng)管理資源與對(duì)話所帶來(lái)的好處。snmp+ 在編程上的安全突出表現(xiàn)在下面的領(lǐng)域:.為 snmp 資源提供安全的管理為面向?qū)ο蟮姆椒ㄒ呀?jīng)將snmp 內(nèi)部機(jī)制封裝、并隱藏好了。snmp+ 的簡(jiǎn)單易用表現(xiàn)在以下方面:1.2
6、.1.1.為 snmp 提供了簡(jiǎn)單易用的接口使用 snmp+ 不需要精通snmp,甚至不需要精通c+!因?yàn)?snmp+ 里面幾乎沒有c 的指針,所以可以簡(jiǎn)單的通過(guò)api 直接使用。.可以方便的遷移至snmpv2snmp+ 的主要目標(biāo)之一就是開發(fā)一套api,(使得)遷移至snmpv2(的過(guò)程中)盡可能少地影響現(xiàn)有代碼。snmptarget class(譯注:后面將要講到)使之成為了可能。.保留了對(duì)snmp 靈活的底層開發(fā)這是為了方便那些不希望使用面向?qū)ο蠓椒?,而直接編寫snmp 的底層機(jī)制的用戶。雖然 snmp+ 快速而方便,但是有些時(shí)候程序員也許希望直接使用底層的s
7、nmp api。.鼓勵(lì)程序員用功能強(qiáng)大的c+,不要因?qū)W得不夠快而去指責(zé)它使用 snmp+ 的用戶不需要精通c+。基本的 snmp 的知識(shí)是必要的,但是實(shí)際上也需要對(duì) c+初步的理解。1.2.2.編程安全的snmp+大多數(shù) snmp api 需要程序員去管理大量的資源。不恰當(dāng)?shù)难b載或卸載這些資源,會(huì)導(dǎo)致內(nèi)存崩潰或泄漏。snmp+ 提供的安全機(jī)制,(可以)實(shí)現(xiàn)對(duì)這些資源的自動(dòng)管理。snmp+ 的用戶(可以)體驗(yàn)到自動(dòng)管理資源與對(duì)話所帶來(lái)的好處。snmp+ 在編程上的安全突出表現(xiàn)在下面的領(lǐng)域:.為 snmp 資源提供安全的管理為面向?qū)ο蟮姆椒ㄒ呀?jīng)將snmp 內(nèi)部機(jī)制封裝、
8、并隱藏好了。snmp+ 的簡(jiǎn)單易用表現(xiàn)在以下方面:.為 snmp 提供了簡(jiǎn)單易用的接口使用 snmp+ 不需要精通snmp,甚至不需要精通c+!因?yàn)?snmp+ 里面幾乎沒有c 的指針,所以可以簡(jiǎn)單的通過(guò)api 直接使用。.可以方便的遷移至snmpv2snmp+ 的主要目標(biāo)之一就是開發(fā)一套api,(使得)遷移至snmpv2(的過(guò)程中)盡可能少地影響現(xiàn)有代碼。snmptarget class(譯注:后面將要講到)使之成為了可能。.保留了對(duì)snmp 靈活的底層開發(fā)這是為了方便那些不希望使用面向?qū)ο蠓椒ǎ苯泳帉憇nmp 的底層機(jī)制的用戶。雖然 snmp+
9、 快速而方便,但是有些時(shí)候程序員也許希望直接使用底層的snmp api。.鼓勵(lì)程序員用功能強(qiáng)大的c+,不要因?qū)W得不夠快而去指責(zé)它使用 snmp+ 的用戶不需要精通c+?;镜?snmp 的知識(shí)是必要的,但是實(shí)際上也需要對(duì) c+初步的理解。1.2.2.編程安全的snmp+大多數(shù) snmp api 需要程序員去管理大量的資源。不恰當(dāng)?shù)难b載或卸載這些資源,會(huì)導(dǎo)致內(nèi)存崩潰或泄漏。snmp+ 提供的安全機(jī)制,(可以)實(shí)現(xiàn)對(duì)這些資源的自動(dòng)管理。snmp+ 的用戶(可以)體驗(yàn)到自動(dòng)管理資源與對(duì)話所帶來(lái)的好處。snmp+ 在編程上的安全突出表現(xiàn)在下面的領(lǐng)域:.為 snmp 資源提供
10、安全的管理/- construct a snmp+ snmp object -snmp snmp( status); / create a snmp+ sessionif ( status != snmp_class_success) / checkcreation statuscout snmp.error_msg( status);/ if fail, print error stringreturn;/- invoke a snmp+ get -pdu += vb;/add the variable binding to the pduif (status = snmp.get(pdu,
11、 ctarget) != snmp_class_success)cout snmp.error_msg( status);else pdu.get_vb( vb,0);/ extract the variable binding from pducout “ system descriptor = ” vb.get_printable_value(); / print out the value;/ thats all!真正屬于snmp+的語(yǔ)句就 10行代碼。 (首先) 用代理端的ip 地址建立一個(gè)ctarget對(duì)象;(然后)用mib對(duì)象所定位的系統(tǒng)描述符創(chuàng)建一個(gè)變量綁定(vb );(接著就把
12、)這個(gè) vb 納入一個(gè)pdu對(duì)象;(最后生成) 一個(gè) snmp對(duì)象來(lái)執(zhí)行snmp的 get操作。一旦找到了 ( 所需的數(shù)據(jù) ) ,( 對(duì)應(yīng)的 ) 應(yīng)答消息就被打印出來(lái)。(并且)所有的錯(cuò)誤處理代碼也都包含了。3.snmp+特性3.1.完整的一套snmp c+類snmp+是以一套c+ 類作為基石的。這些類是:對(duì)象描述符(oid )類、變量綁定(vb)類、協(xié)議數(shù)據(jù)單元(pdu )類、 snmp類。并且,其他各種用抽象語(yǔ)法表示(asn.1 )來(lái)描述的管理信息結(jié)構(gòu)(smi ),也被抽象成了簡(jiǎn)單的、面向?qū)ο蟮念愋汀?.2.snmp內(nèi)存的自動(dòng)管理當(dāng) snmp+的對(duì)象被實(shí)例化或銷毀的時(shí)候, 其相關(guān)的類可以自動(dòng)
13、管理著各種各樣的snmp結(jié)構(gòu)和資源。 這就使得應(yīng)用的開發(fā)者不用再擔(dān)心數(shù)據(jù)結(jié)構(gòu)和資源的卸載,不然就得為防止內(nèi)存的崩潰或者泄漏提供有效的保護(hù)措施。snmp+的對(duì)象的實(shí)例化可以是靜態(tài)的,也可以是動(dòng)態(tài)的。靜態(tài)的實(shí)例化可以在對(duì)象脫離它的作用域時(shí)卸載掉;動(dòng)態(tài)分配則需要使用c+的 new 和 delete 。在 snmp+內(nèi)部,有許多被隱藏和保護(hù)在公用接口后面的smi 結(jié)構(gòu)。所有的 smi 結(jié)構(gòu)都是在內(nèi)部管理的,程序員不需要定義或管理smi 的結(jié)構(gòu)和它的值。因?yàn)樵?snmp+內(nèi)絕大部分地方是不存在c 的指針的。3.3.簡(jiǎn)單易用的由于隱藏并管理了所有smi 結(jié)構(gòu)和它們的值,snmp+的類使用起來(lái)即簡(jiǎn)單又安全。
14、外部程序員無(wú)法破壞到隱藏和保護(hù)在作用域后面的東東。3.4.強(qiáng)大靈活的snmp+提供了強(qiáng)大靈活的功能,降低了管理和執(zhí)行的復(fù)雜性。每個(gè)snmp+對(duì)象都通過(guò)建立一個(gè)會(huì)話來(lái)和一個(gè)代理端聯(lián)系。即由一個(gè)snmp+的對(duì)話類的實(shí)例,就能處理所有與特定代理端的連接。另外自動(dòng)重發(fā)和超時(shí)控制的機(jī)制,為每個(gè)snmp+對(duì)象都帶來(lái)了可靠性。一個(gè)應(yīng)用可能會(huì)包含許多snmp+的對(duì)象的實(shí)例,每個(gè)實(shí)例都可能與相同或不同的代理端通話。 有了這個(gè)功能強(qiáng)大的特性,網(wǎng)絡(luò)管理程序就可以為每個(gè)管理單元建立起不同的會(huì)話。另一方面,就算單一的snmp 會(huì)話也可以解決問(wèn)題。例如:一個(gè)應(yīng)用可以通過(guò)一個(gè)snmp+對(duì)象來(lái)處理圖形統(tǒng)計(jì),另一個(gè)snmp+對(duì)
15、象監(jiān)控 trap ,也許還有第三個(gè)snmp+ 對(duì)象用以瀏覽snmp 。 snmp+自動(dòng)并行處理了同一時(shí)刻來(lái)自不同snmp+實(shí)例的請(qǐng)求。3.5.可移植對(duì)象的snmp+的主體是可以移植的c+ 代碼。其中只有snmp class 的實(shí)現(xiàn)與不同的目標(biāo)操作系統(tǒng)有關(guān)。如果你的程序中包含了snmp+的代碼,那么導(dǎo)出這部分代碼的時(shí)候,就可以不做任何修改。3.6.自動(dòng)超時(shí)和重發(fā)機(jī)制snmp+提供了自動(dòng)超時(shí)和重發(fā)機(jī)制,程序員不用去實(shí)現(xiàn)超時(shí)或重發(fā)機(jī)制的代碼。重發(fā)機(jī)制是在 snmptarget class 里面定義的, 這就使得每一個(gè)目標(biāo)(target )都具有了它自己的超時(shí) /重發(fā)機(jī)制。3.7.阻塞模式snmp+提
16、供了阻塞方式。ms-windows上的阻塞方式可以并發(fā)的阻塞從每個(gè)snmp 類的實(shí)例發(fā)出的請(qǐng)求。3.8.異步的非阻塞模式snmp+還為應(yīng)答提供了異步的非阻塞的方式。超時(shí)和重發(fā)機(jī)制同時(shí)支持阻塞和異步兩種模式。3.9.notification、trap的收發(fā)snmp+允許在多種傳輸層上(包括ip 和 ipx )收發(fā) trap 。而且 snmp+還允許使用非標(biāo)準(zhǔn)的ip 端口和 ipx 套接口來(lái)收發(fā)trap 。3.10.通過(guò)雙效的api支持 snmpv1和 snmpv2snmp+的設(shè)計(jì)可同時(shí)支持snmpv1和 snmpv2的使用。所有 api 的操作都被設(shè)計(jì)成了雙效的,也即操作是snmp 版本無(wú)關(guān)的。
17、通過(guò)使用snmptarget類,與 snmp 的版本相關(guān)的操作被抽象出來(lái)了。3.11.支持 snmp的 get, get next, get bulk, set, inform和 trap的操作snmp+完整的支持snmp 的 6 種操作。這 6 個(gè) snmp+的成員函數(shù)使用相同的參數(shù)表,也都支持阻塞和非阻塞(異步)方式。3.12.通過(guò)繼承實(shí)現(xiàn)重定義snmp+是用 c+ 實(shí)現(xiàn)的,所以允許程序員重載或重定義那些不適合他們的操作。舉個(gè)例子:如果一個(gè)應(yīng)用需要特定的oid 對(duì)象,那就需要建立一個(gè)oid class 的子類,用以繼承所有 oid 類的屬性和操作,同時(shí)在派生類種加入新的屬性和操作。4.在
18、microsoft windows 系列操作系統(tǒng)上使用snmp+snmp+已經(jīng)在 ms-windows 3.1, ms-windows for work groups 3.11, ms-windows nt 3.51, and ms- windows ?95 上實(shí)現(xiàn)了。4.1.winsnmp version 1.1的使用在 ms-windows上可以用winsnmp version 1.1 來(lái)運(yùn)行 snmp+。這就使得其他用winsnmp代碼直接寫的snmp 應(yīng)用可以與snmp+的應(yīng)用兼容。 注意, 目前 hp 的 ms-windows設(shè)備使用winsnmp ,其他設(shè)備不需要使用winsnmp
19、來(lái)進(jìn)行 ans.1的編碼和解碼。但那些沒有使用winsnmp的設(shè)備也需要與winsnmp的應(yīng)用兼容,才能和snmp+ 的應(yīng)用兼容。4.2.對(duì) ip 和 ipx的支持可以通過(guò)一個(gè)winsock compliant stack ,來(lái)實(shí)現(xiàn)對(duì)ip 的操作。 同時(shí)為了在ipx 協(xié)議上運(yùn)行,還需要兼容novell網(wǎng)絡(luò)的客戶程序和驅(qū)動(dòng)。目前snmp+已經(jīng)通過(guò)了在廣泛多樣的協(xié)議棧下的運(yùn)行測(cè)試,這些協(xié)議棧包括:ftp,netmanage,lanworkplace,ms-wfwg 3.11 ,以及 windows nt 。4.3.對(duì) notification、trap收發(fā)的支持snmp+ 包含了對(duì)winsnmp
20、trap機(jī)制的支持。這同時(shí)包括了trap的發(fā)送和收取。在接收 trap的時(shí)候,還提供了過(guò)濾trap的功能。4.4.與 hp openview for windows 兼容已經(jīng)有大量使用snmp+創(chuàng)建的應(yīng)用,實(shí)現(xiàn)了hp openview for windows的兼容。5.在 unix上使用 snmp+5.1.統(tǒng)一的類的接口用在 unix設(shè)備上的snmp+類的接口和ms-windows是一樣的。5.2.windows到 unix的仿真與移植通過(guò)編譯、連接對(duì)應(yīng)的snmp+類, snmp+就可以實(shí)現(xiàn)在unix上運(yùn)行。 snmp+/unix的設(shè)計(jì)決定了它可以同時(shí)運(yùn)行在原始的unix字符模式、 x-win
21、dow模式,或者windows-to-unix的仿真工具上。5.3.與 hp openview for unix 兼容已經(jīng)有大量使用snmp+創(chuàng)建的應(yīng)用,實(shí)現(xiàn)了與hp openview for unix的兼容。6.snmp syntax classessnmp+之 snmp syntax的對(duì)象模型(object modeling technique)視圖snmp+的 snmp syntax classe描繪了一個(gè)具有c+ 面向?qū)ο箫L(fēng)格的視圖。即用于描述 snmp 的 smi 之 asn.1的數(shù)據(jù)類型視圖。 它包含了映射到對(duì)應(yīng)的smi 類型的一組類的集合。而且為了方便使用,還引入了一些非smi
22、的類。 snmp+為這些 snmp 數(shù)據(jù)類型提供了強(qiáng)大、簡(jiǎn)單易用的接口。下表概要地描述了各種snmp+ syntax classes :snmp+ syntax class nameclass descriptionsmi or asn.1 counter partsnmpsyntaxparent of all syntax classes.no asn.1 counter part, used for oo structure.oidobject identifier class.asn.1 object identifier.octectstroctet string class.asn.
23、1 octet string.uint32unsigned 32 bit integer class.smi unsigned 32 bit integer.timetickstimeticks class.smi time ticks.counter3232 bit counter class.smi 32 bit counter.gauge3232 bit gauge class.smi 32 bit gauge.int32signed 32 bit integer.smi 32 bit signed integer.counter6464 bit counter class.smi 64
24、 bit counter.addressabstract address class.no asn.1 counter part used for oo structure.ipaddressip address class.smi ip address.udpaddressudpaddress classsmi ip address with port specification.ipxaddressipx address class.no asn.1 or smi counter partipxsockaddressipx address class with socket number.
25、no asn.1 or smi counter partmacaddressmac address class.smi counter partgenaddressgeneric addressno asn.1 or smi counter part.7.object id classsnmp+之 oid class的對(duì)象模型(object modeling technique)視圖7.1.對(duì)象標(biāo)識(shí)符類對(duì)象標(biāo)識(shí)符類(oid )封裝了smi 的對(duì)象標(biāo)識(shí)。信息管理庫(kù)(mib )中所定義的smi 的對(duì)象是一種在mib 中找到的數(shù)據(jù)元素的數(shù)據(jù)標(biāo)識(shí)。與smi oid 相關(guān)的結(jié)構(gòu)和函數(shù),自然都是面向?qū)ο蟮?/p>
26、。 事實(shí)上 oid class 與 c+ 的 string class 有許多共同之處。 如果你熟悉c+ 的 string class 或者 mfc 的 cstring class ,那么你就會(huì)感覺oid class 用起來(lái)很親切、簡(jiǎn)單。 oid class 被設(shè)計(jì)成了快速有效的類;它可以定義和操作對(duì)象標(biāo)識(shí);不依賴現(xiàn)有的 snmp api ,完全是可移植的;可以在任何ansi c+ 編譯器上進(jìn)行編譯。7.2.oid class的成員函數(shù)列表oid class member functions 說(shuō)明constructorsoid:oid( void);構(gòu)造一個(gè)空的的oidoid:oid( con
27、st char *dotted_string);用帶點(diǎn)的字符串構(gòu)造新的oidoid:oid( const oid &oid);用已有的 oid 構(gòu)造新的oidoid:oid( const unsigned long *data, int len);通過(guò)一個(gè)指針和長(zhǎng)度來(lái)構(gòu)造一個(gè)新的oiddestructoroid:oid( );銷毀一個(gè) oid ,釋放所有的堆overloaded operators oid & operator = ( const char *dotted_string);將一個(gè)帶點(diǎn)的字符串付給一個(gè)oidoid & operator = ( const
28、oid &oid);將一個(gè) oid 付給另一個(gè)oidint operator = ( const oid &lhs, const oid& 判斷兩個(gè) oid 是否相等rhs);int operator = ( const oid& lhs, const char*dotted_string);判斷一個(gè) oid 是否和一個(gè)帶點(diǎn)的字符串相等int operator != ( const oid &lhs, const oid& rhs);判斷兩個(gè) oid 是否不等int operator != ( const oid & lhs, const
29、 char *dotted_string);判斷一個(gè) oid 是否和一個(gè)帶點(diǎn)的字符串不相等int operator ( const oid &lhs, const oid& rhs);判斷一個(gè) oid 是否比另一個(gè)小int operator ( const oid &lhs, const char *dotted_string);判斷一個(gè) oid 是否比一個(gè)帶點(diǎn)的字符串小int operator =( const oid &lhs,const oid &rhs);判斷一個(gè) oid 是否 “ 小于等于 ” 另一個(gè)int operator ( const o
30、id &lhs, const oid &rhs);判斷一個(gè) oid 是否比另一個(gè)大int operator ( const oid &lhs, const char * dotted_string);判斷一個(gè) oid 是否比一個(gè)帶點(diǎn)的字符串大int operator = ( const oid&lhs, const oid &rhs);判斷一個(gè) oid 是否 “ 大于等于 ” 另一個(gè)int operator = ( const oid &lhs, const char* dotted_string);判斷一個(gè) oid 是否 “ 大于等于 ” 一個(gè)
31、帶點(diǎn)的字符串oid& operator += ( const char *dotted_string);將一個(gè)帶點(diǎn)的字符串加到一個(gè)oid 后面oid& operator +=( const unsigned long i);將一個(gè)整數(shù)加到一個(gè)帶點(diǎn)的oid 字符串后面oid& operator+=( const oid& oid);將一個(gè) oid 加到另一個(gè) oid 后面unsigned long &operator ( int position);訪問(wèn) oid 的一個(gè)獨(dú)立子單元output member functions char * get_prin
32、table( const unsigned int n);返回一個(gè) oid 的 n 個(gè)帶點(diǎn)格式的子單元char *get_printable( const unsigned long s, const unsigned long n);返回從 s 開始,以點(diǎn)號(hào)分割的n 個(gè)子單元char *get_printable();返回以點(diǎn)號(hào)分割的oid 字符串operator char *();同上miscellaneous member functions set_data (const unsigned long *data,const unsigned long n);用指針和長(zhǎng)度來(lái)設(shè)置一個(gè)oid
33、unsigned long len( );返回 oid 中子單元的個(gè)數(shù)(長(zhǎng)度)trim( const unsigned long n=1);刪除 oid 最右邊的 n 個(gè)子單元,默認(rèn)刪除1個(gè)ncompare( const unsigned long n, const oid& oid);從左至右比較oid 的前 n 個(gè)子單元rncompare( const unsigned long n, const oid& oid);從右至左比較oid 的后 n 個(gè)子單元int valid( );返回 oid 的有效性7.3.一些 oid class的例子下面的例子展示了oid class
34、 的不同用法。 oid class 不需要依賴其他庫(kù)和模塊。下列代碼在 ansi/iso c+ 上編譯通過(guò)#include “ oid.h”void oid_example()/ construct an oid with a dotted string and print it outoid o1(..9.1);cout “ o1= “ o1.get_printable ();/ construct an oid with another oid and print it outoid o2(o1);cout “ o2=” o2.get_printable();/
35、 trim o2?s last value and print it outo2.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, o3oid o3;/ assign o3 a value and print it outo3=..9.3;cout “ o3= ” o3.get_printable();/ create o4oi
36、d o4;/ assign o4 o1?s valueo4=o1;/ trim off o4 by 1 o4.trim(1);/ concat a 4 onto o4 and print it outo4+= ” .4 ”;cout “ o4= ” o4.get_printable();/ make o5 from o1 and print it outoid o5(o1);cout “ o5= ” o5.get_printable();/ compare two not equal oidsif (o1=o2)cout o1 equals o2;else cout o1 not equal
37、to o2; / print out a piece of o1cout strval(3) of o1 = “ o1.get_printable(3);/ print out a piece of o1cout strval(1,3) of o1 = “ o1.get_printable(1,3);/ set o1s last subid o1 o1.len()-1 = 49;cout o1 modified = “ o1.get_printable();/ set o1s 3rdsubido12=49;cout o1 modified = “ o1.get_printable();/ ge
38、t the last subid of 02cout last of o2 = “ o2o2.len()-1;/ get the 3rdsubid of 02cout 3rd of o2 = “ o22;/ ncompareif (o1.ncompare(3,o2)cout ncompare o1,o2,3 =;elsecout ncompare o1,o2,3 !=; / make an array of oidsoid oids30;int w;for ( w=0;w30;w+) oidsw = 300.301.302.303.304.305.306.307; oidsw += (w+1)
39、; for (w=0;w25;w+)sprintf( msg,oids%d = %s,w,oidsw.get_printable();printf(“ %s” ,msg, strlen(msg); 8.octetstr classsnmp+之 octetstr class的對(duì)象模型(object modeling technique)視圖8.1.八位字節(jié)類通過(guò) snmp+的 octet class ,可以簡(jiǎn)單且安全地操作smi 的 8 位字節(jié)。有了octet class ,就不需要通過(guò)內(nèi)部指針和長(zhǎng)度來(lái)操作8 位字節(jié)了。使用snmp+的 octet class 來(lái)實(shí)例化、操作、銷毀一個(gè)8 位字節(jié)
40、對(duì)象是很簡(jiǎn)單的,不用擔(dān)心如何管理內(nèi)存以及內(nèi)存是否會(huì)泄漏。與ansi c+ 的 string class 類似, octetstr class 可以通過(guò)多種方法構(gòu)造8位字節(jié),還可以對(duì)它們進(jìn)行賦值操作,與其他snmp+ classes一起使用。8.2.octetstr class的成員函數(shù)列表octetstr class member functions 說(shuō)明constructors octetstr:octetstr( void);構(gòu)造一個(gè)空的octetstroctetstr:octetstr( const char* string);用一個(gè)沒有結(jié)束符的字符串構(gòu)造octetstroctetstr
41、:octetstr( const unsigned char *s, unsigned long int i);通過(guò)一個(gè)指針和長(zhǎng)度來(lái)構(gòu)造octetstroctetstr:octetstr( const octetstr &octet);用已有的 octetstr構(gòu)造新的 octetstrdestructoroctetstr:octetstr( );銷毀一個(gè) octetstroverloaded operatorsoctetstr& operator = ( const char *string); 將一個(gè)沒有結(jié)束符的字符串付給一個(gè)octetstroctetstr& op
42、erator = ( const octetstr& octet);將一個(gè) octetstr付給另一個(gè)octetstrint operator = ( const octetstr &lhs, const octetstr &rhs);判斷兩個(gè) octetstr對(duì)象是否相等int operator = ( const octetstr & lhs, const char *string); 判斷 octetstr是否和一個(gè) char*字符串相等int operator != ( const octetstr& lhs, const octetstr&am
43、p; rhs);判斷兩個(gè) octetstr對(duì)象是否不相等int operator != ( const octetstr& lhs, const char *string);判斷 octetstr是否和一個(gè) char*字符串不相等int operator ( const octetstr&lhs, const octetstr& rhs);判斷一個(gè) octetstr是否比另一個(gè)小int operator ( const octetstr &lhs, const char * string);判斷一個(gè) octetstr是否比另一個(gè)char *字符串小int ope
44、rator = ( const octetstr &lhs, const 判斷一個(gè) octetstr是否 “ 小于等于 ” 另一個(gè)octetstr &rhs);int operator ( const octetstr& lhs, const octetstr &rhs);判斷一個(gè) octetstr是否比另一個(gè)大int operator ( const octetstr& lhs, const char * string);test if one octetstr is greater than a char *.判斷一個(gè) octetstr是否比一個(gè)ch
45、ar *的字符串大int operator = ( const octetstr& lhs, const octetstr &rhs);判斷一個(gè) octetstr是否 “ 大于等于 ” 另一個(gè)int operator = ( const octetstr& lhs, const char *);判斷一個(gè) octetstr是否 “ 大于等于 ” 一個(gè)char*的字符串octetstr& operator +=( const char * string);在一個(gè) octetstr后面連接一個(gè)字符串octetstr& operator +=( const un
46、signed char c);在一個(gè) octetstr后面連接一個(gè)單字符octetstr& operator+=( const octetstr &octetstr);將兩個(gè) octetstr連接在一起unsigned char& operator ( int position i);用數(shù)組的形式來(lái)訪問(wèn)一個(gè)octetstrmiscellaneous void set_data( const unsigned char *s, unsigned long l);用指針和長(zhǎng)度來(lái)設(shè)置一個(gè)octetstrint ncompare( const unsigned long n,
47、const octetstr &o);與另一個(gè) octetstr比較前 n 個(gè)元素unsigned long len();返回一個(gè) octetstr的長(zhǎng)度int valid();返回一個(gè) octetstr的有效性u(píng)nsigned char * data();返回一個(gè)指向內(nèi)部數(shù)據(jù)的指針char * get_printable();格式化輸出,如果不是ascii則按 16 進(jìn)制處理char * get_printable_hex();按 16 進(jìn)制格式,進(jìn)行格式化輸出8.3.注意當(dāng)輸出一個(gè)octetstr對(duì)象時(shí), 如果該 8 位字節(jié)所包含的字符不是ascii碼,對(duì)成員函數(shù)char * 或者
48、 get_printable()的調(diào)用,就會(huì)自動(dòng)轉(zhuǎn)換成對(duì)成員函數(shù)get_printable_hex()的調(diào)用。這就使得使用者只需要簡(jiǎn)單地使用成員函數(shù)char * 或 get_printable()來(lái)進(jìn)行輸出。而成員函數(shù)get_printable_hex()是專門用來(lái)把octetstr按 16 進(jìn)制格式輸出的。8.4.一些 octetstr class的例子/ octet class examples#include“ octet.h”void octet_example()octetstr octet1;/ create an invalid un- initialized octet obj
49、ectoctetstr octet2( “ red hook extra bitter ale” );/ create an octet with a stringoctetstr octet3( octet2);/ create an octet with another octetunsigned char raw_data50; / create some raw data octetstr octet4( raw_data, 50);/ create an octetstr using unsigned char dataoctet1 = “ sierra nevada pale al
50、e”; / assign one octet to anothercout octet1.get_printable();/ show octet1 as a null terminated stringcout octet4.get_printable_hex();/ show octet4 as a hex stringcout (char *) octet1;/ same as get_printable()if ( octet1 = octet2) / compare two octetscout = octet3)cout “ octet2 greater than or equal
51、 to octet2”;octet24 = ,b?;/ modify an element of an octetstr using ?s9.timeticks classsnmp+之 timeticks class的對(duì)象模型(object modeling technique)視圖9.1.時(shí)間戳類snmp+的 timeticks class 為使用 smi 中的 timeticks帶來(lái)了方便。 smi 的時(shí)間戳被定義成了一種存放無(wú)符號(hào)長(zhǎng)整形的存儲(chǔ)單元。為了成為無(wú)符號(hào)長(zhǎng)整形,smi timeticks被加工成了一種特殊的類型。因此snmp+的 timeticks類具有無(wú)符號(hào)長(zhǎng)整形的所有功能和屬
52、性,但同時(shí)又是一個(gè)獨(dú)立的類。對(duì)無(wú)符號(hào)長(zhǎng)整形的任何操作,拿到timeticks的對(duì)象上一樣有效。 timeticks class 與其他 snmp+的類,比如vb class 交互的時(shí)候,還可以有些額外的操作:在使用vb class 的時(shí)候, timeticks的對(duì)象可以被置入vb 對(duì)象(用vb:set),也從 vb 對(duì)象中取出(用vb:get)。也即,對(duì)于smi timeticks,開發(fā)者可以像對(duì)無(wú)符號(hào)長(zhǎng)整形一樣來(lái)操作,并且還提供了一對(duì)一的映射關(guān)系。9.2.timeticks class的成員函數(shù)列表timeticks class member functions說(shuō)明constructorst
53、imeticks:timeticks( void);構(gòu)造一個(gè)空的timeticks對(duì)象cout octet.len();/ print out the length of an octetstrunsigned char raw_data100; octet1.set_data( raw_data, 100);/ set the data of an to unsigned char data/ get the validity of an octetstrcout (octet1.valid()? “ octet1 is valid” : “ octet1 is invalid”; / en
54、d octet exampletimeticks:timeticks( const unsigned long i );用一個(gè)無(wú)符號(hào)長(zhǎng)整形來(lái)構(gòu)造一個(gè)timeticks對(duì)象timeticks:;timeticks( const timeticks &t);用一個(gè)已有的timeticks對(duì)象來(lái)構(gòu)造一個(gè)新的destructor timeticks:timeticks( );銷毀一個(gè) timeticks對(duì)象overloaded operators timeticks& operator =( const timeticks &t);重載賦值操作符char * get_print
55、able();格式化輸出,格式為:dd days, hh:mm:ss.hhoperator unsigned long();把 timeticks轉(zhuǎn)換為無(wú)符號(hào)長(zhǎng)整形9.3.注意timeticks對(duì)象用 timeticks:get_printable()輸出時(shí),其值自動(dòng)被格式化為“ dd days,hh:mm:ss.hh”。其中 dd 代表天, hh 代表小時(shí)( 24 時(shí)制的), mm 代表分鐘, ss 是秒鐘, hh 則是百分之幾秒。9.4.一些 timeticks class的例子/ timeticks examples#include “ timetick.h”void timeticks
56、_example()timeticks tt;/ create an un-initialized timeticks instancetimeticks tt1( (unsigned long) 57);/ create a timeticks using a numbertimeticks tt2( tt1);/ create a timeticks using another instancett = 192;/ overloaded assignment to a numbertt2 = tt;/ overloaded assignment to another timeticksco
57、ut tt.get_printable(); / print out in dd days, hh:mm:ss.hh cout ( unsigned long)tt; / print out unsigned long int value; / end timeticks example10.counter32 classsnmp+之 counter32 class的對(duì)象模型(object modeling technique)視圖10.1.32 位計(jì)數(shù)器類當(dāng)需要用到smi 中的 32 位計(jì)數(shù)器時(shí),snmp+的 counter32 class為之帶來(lái)了方便。smi 的計(jì)數(shù)器被定義成了一種存放無(wú)
58、符號(hào)長(zhǎng)整形的存儲(chǔ)單元。為了成為無(wú)符號(hào)長(zhǎng)整形,smi counters被加工成了一種特殊的類型。因此 snmp+的 counter32類具有無(wú)符號(hào)長(zhǎng)整形的所有功能和屬性,但同時(shí)又是一個(gè)獨(dú)立的類。對(duì)無(wú)符號(hào)長(zhǎng)整形的任何操作,拿到counter32的對(duì)象上一樣有效。counter32 class 與其他 snmp+的類, 比如 vb class 交互的時(shí)候,還可以有些額外的操作:在使用vb class 的時(shí)候, counter32的對(duì)象可以被置入 vb 對(duì)象(用 vb:set),也從 vb 對(duì)象中取出(用vb:get)。也即,對(duì)于smi counter ,開發(fā)者可以像對(duì)無(wú)符號(hào)長(zhǎng)整形一樣來(lái)操作,并且還提
59、供了一對(duì)一的映射關(guān)系。10.2.counter32 class的成員函數(shù)列表counter32 class member functions 說(shuō)明constructorscounter32:counter32( void);構(gòu)造一個(gè)空的counter32對(duì)象counter32:counter32( const unsigned long i );用一個(gè)無(wú)符號(hào)長(zhǎng)整形來(lái)構(gòu)造一個(gè)counter32對(duì)象counter32:counter32( const counter32 &c);用一個(gè)已有的counter32對(duì)象來(lái)構(gòu)造一個(gè)新的destructorcounter32:counter32( )
60、;銷毀一個(gè) timeticks對(duì)象overloaded operatorscounter32& operator = ( const counter32& c);重載賦值操作符char * get_printable();格式化輸出counter32對(duì)象operator unsigned long( );把 counter32轉(zhuǎn)換為無(wú)符號(hào)長(zhǎng)整形10.3.一些 counter32 class的例子/ counter examples#include “ counter.h”void counter_example()counter32 ctr;/ create an un-initialized counter instancecounter32 ctr1( (unsigned long) 57);/ create a counter using a number counter32 ctr2(ctr1);/ create a counter using another instance ctr = 192 ; / overloaded assignment to a numberctr1 = ctr;/ overloaded assig
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CCS 021-2023煤礦井下鉆孔機(jī)器人通用技術(shù)條件
- T/CEPPEA 5048-2024電力調(diào)控云平臺(tái)設(shè)計(jì)規(guī)范
- 酒類業(yè)務(wù)員工資合同5篇
- 門窗經(jīng)營(yíng)部雇傭合同范本4篇
- 新編民間借款抵押合同2篇
- 物業(yè)外包服務(wù)合同書4篇
- 正常呼吸課件
- 車輛轉(zhuǎn)讓協(xié)議合同樣本5篇
- 火車自備車租賃合同范本4篇
- 2025年毛坯房承包裝修合同2篇
- 高血壓心臟病超聲
- 中南林業(yè)科技大學(xué)《Python程序設(shè)計(jì)實(shí)驗(yàn)》2021-2022學(xué)年期末試卷
- 麻醉科與患者安全溝通制度
- 2024年六年級(jí)道德與法治下冊(cè) 第三單元 多樣文明 多彩生活 7 多元文化 多樣魅力教案 新人教版
- 污水處理ao工藝
- 2024年重慶市中考數(shù)學(xué)試題B卷含答案
- 安徽理工大學(xué)《高等安全工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 林業(yè)工程整改方案
- 2024年7月1日實(shí)施新版醫(yī)療器械采購(gòu)、收貨、驗(yàn)收、貯存、銷售、出庫(kù)、運(yùn)輸和售后服務(wù)工作程序
- 2024紙箱廠規(guī)章制度
評(píng)論
0/150
提交評(píng)論