明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

SNMP用VC++6.0完成的方法

[摘要]SNMP(Simple Network Management Protocol)是簡單網(wǎng)絡(luò)管理協(xié)議,主要用來管理網(wǎng)絡(luò)設(shè)備,正因為“簡單”,所以其發(fā)展很快,到目前為止幾乎所有的網(wǎng)絡(luò)產(chǎn)品都要為其提供支持...
     SNMP(Simple Network Management Protocol)是簡單網(wǎng)絡(luò)管理協(xié)議,主要用來管理網(wǎng)絡(luò)設(shè)備,正因為“簡單”,所以其發(fā)展很快,到目前為止幾乎所有的網(wǎng)絡(luò)產(chǎn)品都要為其提供支持,以方便管理員的管理和軟件開發(fā)人員的開發(fā)。
     在這里我們不對有關(guān)SNMP的概念和基礎(chǔ)知之作過多地闡述,一且假定你對其工作原理有了一定的了解,而僅缺的是如何去實現(xiàn)他。
     我們所闡述的是基于VC6.0下的SNMP編程。詳細介紹一下有關(guān)SNMP編程的過程及API函數(shù)的用法,在遇到難于理解的部分,我會以較大的篇幅作以解釋。言歸正傳,進入我們的主題。
     首先來闡述幾個重要的概念:
     1。community (共同體名):如果翻譯過來可能會顯得難于理解,其實你完全可以把它理解為一個帶有權(quán)限的登陸賬戶,這是你訪問網(wǎng)絡(luò)設(shè)備的重要憑據(jù),比如你要訪問交換機,假如交換機的community是public,其權(quán)限是只讀的,那你一次用戶登陸交換機就可以查看有關(guān)交換機記錄的數(shù)據(jù)。如果其權(quán)限是讀寫的,你你就有權(quán)修改其中的一些設(shè)置,如封鎖某一個交換機的端口。大部分交換機默認情況下,以public作為只讀community,以private作為讀寫community。
     2。Oid(對象標志符):是以SMI(Structure of Management Information)管理信息結(jié)構(gòu)為基礎(chǔ)的一系列點分符號,如1.3.6.1.2.1.1.1,這些點分符號在任何網(wǎng)絡(luò)設(shè)備中都唯一標識某一個數(shù)據(jù)參數(shù)。他們的集合我們稱為MIB(Management Information Base)管理信息庫。對于他們所標識的意義,讀者可以到網(wǎng)上查詢一下,提供一個簡單的尋找辦法,你可以進入google,直接輸入1.3.6.1.2.1.1等點分字符串。
     下面進入我們的正題。
     
     和其他編程過程一樣,整個SNMP編程也要經(jīng)過一個創(chuàng)建,執(zhí)行,銷毀的過程,通俗點說就是要做準備,初始化SNMP環(huán)境即加載SNMP的功能,接著就要執(zhí)行所進行的操作,SNMP是基于消息機制的,所以消息傳遞與管理是我們在編程中所必須注意的問題,最后要進行銷毀和回收資源,這一點相信編程人員
都會注意到。以下我們按步驟給予詳細介紹:
     1。加載SNMP,用到的函數(shù)是SnmpStartup(smiLPUINT32 nMajorVersion,
                                        smiLPUINT32 nMinorVersion,
                                        smiLPUINT32 nLevel,
                                        smiLPUINT32 nTranslateMode,
                                        smiLPUINT32 nRetransmitMode);
      五個參數(shù)作為接收參數(shù)返回SNMP的主版本號,副版本號,支持最高的操作標準,默認的實體/上下文傳輸模式,默認的重發(fā)機制。

     2。建立會話,用到的函數(shù)是HSNMP_SESSION SnmpOpen(
                                      HWND hWnd,  // handle to the notification window
                                      UINT wMsg   // window notification message number
                                                  );
                或HSNMP_SESSION SnmpCreateSession(
                                      HWND hWnd, // handle to the notification window
                                      UINT wMsg, // window notification message number
                                      SNMPAPI_CALLBACK pfnCallBack, // notification callback function
                                      LPVOID lpClientData           // pointer to callback function data
                                                 );
      第二個函數(shù)并沒有被完全確定下來,他只是為程序員在編程過程中不是基于windows的編程提供一種選擇,第一個參數(shù)指向接收消息的窗口句炳,第二個參數(shù)則指向該窗口需要接收的消息碼。該函數(shù)返回一個會話句炳,這一句炳是在我們以下程序中都要用到的一個重要變量。

     3。設(shè)置傳輸模式,用到的函數(shù)是SNMPAPI_STATUS SnmpSetTranslateMode(
                                      smiUINT32 nTranslateMode  // new entity/context translation mode
                                      );
      該函數(shù)只有一個參數(shù),有以下幾種選擇:
           SNMPAPI_TRANSLATED         不常用
           SNMPAPI_UNTRANSLATED_V1    版本V1
           SNMPAPI_UNTRANSLATED_V2    版本V2
      你可以選擇任一個參數(shù),我使用過第二和第三個參數(shù),其區(qū)別是在版本一中g(shù)et_bulk的操作不被允許,因為版本一不支持這種操作,其具體細節(jié)可查閱有關(guān)資料,推薦一本書《用SNMP管理互聯(lián)網(wǎng)絡(luò)》。至于第一個參數(shù)本人未作過試驗,不能加以妄斷。

     4。創(chuàng)建實體,用到的函數(shù)是HSNMP_ENTITY SnmpStrToEntity(
                                     HSNMP_SESSION session,  // handle to the WinSNMP session
                                     LPCSTR string           // pointer to a string that identifies
                                                             // the entity
                                     );
      該函數(shù)的第一個參數(shù)是第二步返回的會話句炳,第二個參數(shù)與你在第三步中設(shè)置的傳輸模式有關(guān),如果你選則后兩個參數(shù),那么這里的string就是你要發(fā)送消息的網(wǎng)絡(luò)設(shè)備ip地址或接收消息的管理設(shè)備ip地址。根據(jù)自己的需要,通常我們將這兩個實體都創(chuàng)建一下。該函數(shù)返回一個實體句炳。

     5。設(shè)置重傳模式,用到的函數(shù)是SNMPAPI_STATUS SnmpSetRetransmitMode(
                                     smiUINT32 nRetransmitMode  // new retransmission mode
                                     );  
        該函數(shù)只有一個參數(shù),有以下兩種選擇
           SNMPAPI_ON      啟動重傳模式       
           SNMPAPI_OFF     關(guān)閉重傳模式

     6。設(shè)置超時時間,用到的函數(shù)是SNMPAPI_STATUS SnmpSetTimeout(
                                     HSNMP_ENTITY hEntity,        // destination management entity
                                     smiTIMETICKS nPolicyTimeout  // new time-out value for database
                                     );
      
       該函數(shù)的第一個參數(shù)是第四步返回的實體句炳,通常我們設(shè)置目標實體的超時時間,也就是接收消息的網(wǎng)絡(luò)設(shè)備的實體。第二個參數(shù)是
超時的時間。

     7。設(shè)置重傳次數(shù),用到的函數(shù)是SNMPAPI_STATUS SnmpSetRetry(
                                    HSNMP_ENTITY hEntity,    // destination management entity
                                    smiUINT32 nPolicyRetry   // new retry count value for database
                                    );
       該函數(shù)的第一個參數(shù)是第四步返回的實體句炳,通常我們設(shè)置目標實體的重傳次數(shù),也就是接收消息的網(wǎng)絡(luò)設(shè)備的實體。第二個參數(shù)是
重傳次數(shù)。

     8。創(chuàng)建上下文句炳,用到的函數(shù)是HSNMP_CONTEXT SnmpStrToContext(
                                    HSNMP_SESSION session,  // handle to the WinSNMP session
                                    smiLPCOCTETS string     // pointer to a string structure
                                    );
       該函數(shù)的第一個參數(shù)是第二步返回的會話句炳,第二個參數(shù)與你在第三步中設(shè)置的傳輸模式有關(guān),如果你選則后兩個參數(shù),那么這里的string就是共同體名。該函數(shù)返回一個上下文句炳。

     由此我們的到了三個重要的句炳,總結(jié)一下:1。會話句炳,2。實體句炳,3。上下文句炳,請記住這三個重要的句炳,因為它們在SNMP編程過程中時刻用到,只有在結(jié)束后才釋放他們。

    9。創(chuàng)建變量捆綁列表,用到的函數(shù)是HSNMP_VBL SnmpCreateVbl(
                                    HSNMP_SESSION session,  // handle to the WinSNMP session
                                    smiLPCOID name,         // pointer to the variable name
                                    smiLPCVALUE value       // pointer to the value to associate
                                                            // with the variable
                                    );
     這是一個比較難理解的函數(shù),要對其有深入的理解,你必須對SNMP的數(shù)據(jù)報格式有所了解,在這里我不能做過多地闡述,可以給你打個比方,好比一個專列火車,他只負責(zé)到目的地接人。開始的時候所有車廂是空的,每個車廂標有號碼,標志其接的人的特征,好比第一車廂要接所有姓趙的人,第二節(jié)車廂要接局以上的領(lǐng)導(dǎo),等等。車頭由司機驅(qū)動著,他當(dāng)然知道自己的目的地,一路幾經(jīng)周折,終于到達目的地,此時車上還未有一個人,目的地的站長首先要檢查該司機的證件和文書,看看他有沒有權(quán)利來接走這批人,如果沒有,就會在第一個車廂內(nèi)坐上一個本站的通知官,他的責(zé)任就是返回告訴源站長官說該司機沒有權(quán)力接人。如果有,那么站長要看看各節(jié)車廂是否符合本站接人的要求,如果符合,就將不同的人送到不同的車廂就坐。如果有改姓的的請求,那么要看本站是否允許,如果允許,就將本站這些符合條件的人改姓。
     在這里我們可以把每節(jié)車廂看作是不同變量,車廂的空間是用來接收人的,那么具有不同特征的人就是返回數(shù)據(jù)。這種車廂與其空間就好比一個綁定,SNMP的數(shù)據(jù)報正如這種方式一次可以有多個綁定。而車廂號就好比對象標志符。當(dāng)然只有第一個是特殊的,因為他要有車頭,所以用SnmpCreateVbl函數(shù),其他的綁定我們要用SnmpSetVb,將其依次連接到前一節(jié)車廂上。
     好了,由上述,我們可以知道了,該函數(shù)的第一個參數(shù)是第二步返回的會話句炳,而其他兩個參數(shù)開始時就可以置為空了。該函數(shù)返回一個綁定列表句炳。

    10。追加綁定列表,用到的函數(shù)是SNMPAPI_STATUS SnmpSetVb(
                                   HSNMP_VBL vbl,     // handle to the variable bindings list
                                   smiUINT32 index,   // position of the variable binding entry
                                                      // in the list
                                   smiLPCOID name,    // pointer to the variable name portion
                                                      // of the entry
                                   smiLPCVALUE value  // pointer to the variable value portion
                                                      // of the entry
                                    );
     我們可以看到這個函數(shù)的后兩個參數(shù)與SnmpCreateVbl相同,也就是車廂與空間的綁定。第一個參數(shù)是HSNMP_VBL,一個綁定列表句炳,這也可以理解,因為我們已經(jīng)創(chuàng)建了綁定列表,第二個參數(shù)是變量綁定索引,想一想,這么多節(jié)車廂,總的有個順序吧,別忙,你會提出一個顯而易見的問題,如果我只創(chuàng)建了頭一個綁定列表,我想在向其追加其他的綁定列表,那么該索引值會有什么用呢?我完全可以順序加進去啊。就像一個隊列似的。完全正確!實際上該函數(shù)也是這樣實現(xiàn)的,當(dāng)我們要追加變量綁定時,我們須將該索引值置為0。該索引值只是在我們實現(xiàn)諸如set命令時才用到,這將在下文中敘述。
     一且進行得很順利,不過如果你沒有進行過SNMP編程的話,你會對其中兩個結(jié)構(gòu)感到迷惑,一個是smiLPCOID,還有就是smiLPCVALUE,別急,先看第一個結(jié)構(gòu),你會發(fā)現(xiàn)有一個英文組合你會很熟悉,因為我在前文介紹過他,就是smiLPCOID中的OID,對了,他的意思是對象標志符,LP如果你常用VC編程也會知道他多數(shù)是一個指針了。是了,他就是一個指向smiOID的指針類型。讓我們看看他的內(nèi)部構(gòu)造:
     typedef struct {
                  smiUINT32     len;    // number of array elements
                  smiLPUINT32   ptr;    // pointer to an array of subidentifiers
                    } smiOID, *smiLPOID;
     有兩個類型,第一個用來指定他有多少個數(shù)字,第二個則指向一個一維數(shù)組,舉個例子,如果一個對象標志符是1.3.6.1.2.1.1.1,那么
len應(yīng)該為8,ptr應(yīng)該指向一個數(shù)組,該數(shù)組的元素由1,3,6,1,2,1,1,1組成,好像“.”沒有了,正確,因為在SNMP中就要用到這樣的結(jié)構(gòu),你會想,怎樣才能構(gòu)造這樣一個結(jié)構(gòu)呢?很簡單,SNMP的API函數(shù)給我們提供了方便,你可以定義一個字符串如"1.3.6.1.2.1.1.1",用
     SNMPAPI_STATUS SnmpStrToOid(
                  LPCSTR string,      // string object identifier to convert
                  smiLPOID dstOID     // object identifier internal representation
                    );函數(shù)來進行轉(zhuǎn)換,看看其中兩個參數(shù),是不是很吻合的對應(yīng)啊。當(dāng)然,這種轉(zhuǎn)換時可逆的,你可以用SnmpOidToStr來進行,具體可以查一下MSDN。
     下面講一講smiLPCVALUE,由上面的推理,你一定可以得出他是一個指向smiVALUE的指針類型。讓我們來看看smiVALUE結(jié)構(gòu),這個結(jié)構(gòu)比較復(fù)雜,我試圖講得清楚一些。
      typedef struct {                // smiVALUE portion of VarBind
         smiUINT32    syntax;         // Insert SNMP_SYNTAX_<type>
      union {
       smiINT    sNumber;       // SNMP_SYNTAX_INT
                                // SNMP_SYNTAX_INT32
       smiUINT32 uNumber;       // SNMP_SYNTAX_UINT32
                                // SNMP_SYNTAX_CNTR32
                                // SNMP_SYNTAX_GAUGE32
                                // SNMP_SYNTAX_TIMETICKS
       smiCNTR64 hNumber;       // SNMP_SYNTAX_CNTR64
       smiOCTETS string;        // SNMP_SYNTAX_OCTETS
                                // SNMP_SYNTAX_BITS
                                // SNMP_SYNTAX_OPAQUE
                                // SNMP_SYNTAX_IPADDR
                                // SNMP_SYNTAX_NSAPADDR
       smiOID    oid;           // SNMP_SYNTAX_OID
       smiBYTE   empty;         // SNMP_SYNTAX_NULL
                                // SNMP_SYNTAX_NOSUCHOBJECT
                                // SNMP_SYNTAX_NOSUCHINSTANCE
                                // SNMP_SYNTAX_ENDOFMIBVIEW
           } value;    // union
      } smiVALUE, *smiLPVALUE;
      從整體上看,該結(jié)構(gòu)有兩個類型構(gòu)成,一個是smiUINT32    syntax; 另一個看上去挺復(fù)雜,但仔細看卻是一個共同體類型,是了,那么它們之間有什么聯(lián)系呢?我們可以想象一下,一個車廂只接收一種類型的數(shù)據(jù),該類型的數(shù)據(jù)又會有他自己的值,如此就好解釋了,syntax就是用來標志數(shù)據(jù)類型的,當(dāng)該類型確定后,我們就從union中找到與它相對應(yīng)的值value。SNMP中這種設(shè)計是很巧妙的。從上面這個結(jié)構(gòu)我們也就了解到在SNMP中所用到的基本數(shù)據(jù)類型了,也就是union中所列出的,在這提一下,通常有關(guān)網(wǎng)絡(luò)設(shè)備描述的值都是smiOCTETS類型。

      再來看看我們已完成的工作,到目前為止我們已經(jīng)有四個句炳了,1。會話句炳,2。實體句炳,3。上下文句炳,4。綁定列表句炳。還介紹了兩個結(jié)構(gòu)。這兩個結(jié)構(gòu)全和變量綁定列表相關(guān),現(xiàn)在火車的車廂和空間已經(jīng)有了,車頭也有了,還差給他裝上輪子,找一個好司機了,需要他記住自己的使命。
      11。要想將數(shù)據(jù)正確的發(fā)送到目的地,我們必須其按照特定的格式來發(fā)送,對于了解ip協(xié)議的編程人員來說,就不需要做過多地解釋了。我們用函數(shù)HSNMP_PDU SnmpCreatePdu(
                       HSNMP_SESSION session, // handle to the WinSNMP session
                       smiINT PDU_type,       // PDU type
                       smiINT32 request_id,   // PDU request identifier
                       smiINT error_status,   // valid only for SNMP_PDU_GETBULK requests
                       smiINT error_index,    // valid only for SNMP_PDU_GETBULK requests
                       HSNMP_VBL varbindlist  // handle to the variable bindings list
                       );來完成該功能。
     第一個和最后一個參數(shù)是我們上面構(gòu)造的會話句炳和變量綁定列表句炳,第二個參數(shù)很重要,他表示我們想要執(zhí)行的操作方式,SNMP中有如下的選項:
     SNMP_PDU_GET      
     SNMP_PDU_GETNEXT
     SNMP_PDU_RESPONSE
     SNMP_PDU_SET
     SNMP_PDU_V1TRAP
     SNMP_PDU_GETBULK
     SNMP_PDU_TRAP

     對于這些操作,我建議讀者最好找點有關(guān)書籍看看,在這里我只對部分操作大概講解一下,SNMP_PDU_GET通常用來獲得某一個特定的對象標志符所對應(yīng)的值,SNMP_PDU_GETNEXT是在編程人員不了解該表列情況下使用的用來獲取一組值的操作。SNMP_PDU_RESPONSE一般是SNMP代理填寫的,表示應(yīng)答發(fā)出操作請求的數(shù)據(jù)報。SNMP_PDU_SET是用來改變某一對象標志符的值的操作。SNMP_PDU_GETBULK只能在V2版本以上使用,是用來解決SNMP_PDU_GETNEXT一次消息只能取得一個數(shù)據(jù)的缺點,可通過發(fā)一次消息取得一組數(shù)據(jù)。SNMP_PDU_V1TRAP和SNMP_PDU_TRAP使用來發(fā)自陷消息的操作。
      第三個參數(shù)request_id,對于同步實現(xiàn)消息機制的編程來說,幾乎沒有作用,但是對于異步操作,該參數(shù)有很重要的作用,你可以用它來標志某一個請求的消息,如果有幾個消息都在消息隊列中,你可以通過它來確定自己想要處理的消息,該值完全可以自己來設(shè)定。
      error_status和error_index在SNMP_PDU_GETBULK操作中分別為PDU中non_repeaters域定一個值和PDU的max_repetitions域指定一個值。
在其他操作中都為0。
      該函數(shù)返回一個PDU句炳。

     萬事俱備了,就讓我們的火車啟航吧。用下面的函數(shù)
     12。   SNMPAPI_STATUS SnmpSendMsg(
                            HSNMP_SESSION session,      // handle to the WinSNMP session
                            HSNMP_ENTITY srcEntity,     // handle to the source entity
                            HSNMP_ENTITY dstEntity,     // handle to the target entity
                            HSNMP_CONTEXT context,      // handle to the context
                            HSNMP_PDU PDU               // handle to the PDU
                                   );
     看看這些參數(shù),是不是我們都已經(jīng)創(chuàng)建過了,添上他們。

     以上就是整個發(fā)送過程,我們再來理順一下,1。加載SNMP,2。建立會話,3。設(shè)置傳輸模式,4。創(chuàng)建實體,5。設(shè)置重傳模式,6。設(shè)置超時時間,7。設(shè)置重傳次數(shù),8。創(chuàng)建上下文句炳,9。創(chuàng)建變量捆綁列表,10。追加綁定列表,11。創(chuàng)建PDU,12。發(fā)送消息。當(dāng)然你如果只須獲得一個數(shù)據(jù),那么第10步就不需要了。
     

     接下來我們要接收消息,并處理他們。
     1。接收消息,用函數(shù)SNMPAPI_STATUS SnmpRecvMsg(
                           HSNMP_SESSION session,      // handle to the WinSNMP session
                           LPHSNMP_ENTITY srcEntity,   // handle to the source entity
                           LPHSNMP_ENTITY dstEntity,   // handle to the target entity
                           LPHSNMP_CONTEXT context,    // handle to the context
                           LPHSNMP_PDU PDU             // handle to the PDU
                                  );
      聲明一下,該函數(shù)的參數(shù)和SnmpSendMsg好像是一樣的,不錯,但參數(shù)的進出不一樣,SnmpRecvMsg除第一個參數(shù)是我們創(chuàng)建過的以外,其他參數(shù)都是輸出參數(shù),就是用來接收的參數(shù),好像很爽的樣子,因為只需自己設(shè)定一個參數(shù),其他的聲明一個變量,只管接收就行了。仔細想想,還挺對應(yīng)的呢!
    
     2。提取數(shù)據(jù)報,用函數(shù)SNMPAPI_STATUS SnmpGetPduData(
                           HSNMP_PDU PDU,            // handle to the PDU
                           smiLPINT PDU_type,        // PDU_type field of the PDU
                           smiLPINT32 request_id,    // request_id field of the PDU
                           smiLPINT error_status,    // error_status field of the PDU
                           smiLPINT error_index,     // error_index field of the PDU
                           LPHSNMP_VBL varbindlist   // handle to the variable bindings list
                                  );
      也很爽,只有第一個參數(shù)是需要你輸入的,而這已經(jīng)通過SnmpRecvMsg得到了,其他的參數(shù)都是需要接收的,看到什么了,對了,request_id,如果你才用異步接收的話,它可很重要的啊,可以幫你標識發(fā)送的消息。還有error_status和error_index,記得嗎,用在SNMP_PDU_GETBULK操作中,他們的意義是不同的,除此之外,他們用來接收SNMP端返回的錯誤消息,如果返回全都是0,那就是正確返回了,如果不是,那你就的查一查他們所代表的意思了,一般的SNMP書上都會有介紹。

     3。計算返回列表數(shù)目,用函數(shù)SNMPAPI_STATUS SnmpCountVbl(
                                      HSNMP_VBL vbl   // handle to the variable bindings list
                                          );
      將你上一步得到的varbindlist代到里面去就行了,他的返回只是一個整型,使你所得到的變量綁定列表返回的變量數(shù)。

     4。取得返回結(jié)果,用函數(shù)SNMPAPI_STATUS SnmpGetVb(
                                      HSNMP_VBL vbl,    // handle to the variable bindings list
                                      smiUINT32 index,  // position of the variable binding entry
                                                        // in the list
                                      smiLPOID name,    // pointer to the structure to receive the
                                                        // variable name
                                      smiLPVALUE value  // pointer to the structure to receive the
                                                        // associated value
                                          );
      既然在上一步已經(jīng)得到了結(jié)果數(shù),用一個簡單的for循環(huán)一次將結(jié)果取出吧。該函數(shù)有四個參數(shù),第一個在第三步已得到,第二個就是你for循環(huán)中的變量值,記住取得變量是從0開始的,后兩個參數(shù)想想是不是與前面某個函數(shù)的參數(shù)有點相似。對了,前面我們把他們都置為空,現(xiàn)在SNMP代理將返回值添了進去,我們可以坐享其成了,定義兩個變量,接收就行了。提醒一下,對ip地址的接收會有點不同,因為返回值將其封裝為一個指針數(shù)組了,你需要一個一個的取出來!

      看上去工作是做完了,別急,還有一個很重要的環(huán)節(jié),難道你沒想過創(chuàng)建了這么多東西就不會占用資源嗎?當(dāng)然要占用,而且你不釋放他它不會自動釋放,前面我們總共介紹了5個重要的句炳,只有會話句炳是在發(fā)送和接收消息時都用到的,所以在發(fā)送和接收消息以后,你要將其他四個句炳釋放掉,那么會話句炳何時釋放呢?對了,應(yīng)該在你應(yīng)用程序退出的過程中釋放掉,進而你會想到創(chuàng)建會話句炳的位置了吧,那就是在構(gòu)造函數(shù)里。以上這些釋放句炳資源的函數(shù)SNMP API都有提供,如SnmpFreeEntity,SnmpFreeContext,SnmpFreeVbl,SnmpFreePdu,SnmpClose,他們的參數(shù)只有一個,就是你要是放得句炳。最后你要清理整個現(xiàn)場,用函數(shù)SnmpCleanup()解決他們吧。
      
      ok了,一且到此完結(jié),大概步驟就這些了,呵呵,你也許對SNMP_PDU_SET和SNMP_PDU_TRAP有些不解,前者你可以在10。追加綁定列表中
改變變量值,當(dāng)然要遵循smiVALUE的結(jié)構(gòu),將類型和值都添上,填好需要改變的對象標志符,11。創(chuàng)建PDU中將類型設(shè)為SNMP_PDU_SET就行了。
     traps有些麻煩,因為它的數(shù)據(jù)報格式有點特別,本人對他也是一知半解,馬馬虎虎能夠?qū)崿F(xiàn),待以后整理思路后在與大家交流!
     
     對于想進行SNMP編程的人員,在下以菜鳥的身份給你們提個醒,SNMP編成的過程很死,但精心的設(shè)計會使你的程序更加的健壯、高效和容易擴展,我強烈的建議你們看看hp的snmp++,他的源代碼很有層次,極易擴展,我的網(wǎng)名本來是zqq_tt但不知被誰申請過了,于是我在csdn里申請的名字是zqqq1,本人的qq號是81126700。非常愿意與大家交流!
     由于自己的時間比較充裕,很想做一點兼職,能給機會者感激不盡!