




已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
一、課程設(shè)計目的以及要求1) 課程設(shè)計目的 隨著網(wǎng)絡(luò)規(guī)模的不斷擴大,網(wǎng)絡(luò)結(jié)構(gòu)也變得越來越復雜。用戶對網(wǎng)絡(luò)應用的需求不斷提高,企業(yè)和用戶對計算機網(wǎng)絡(luò)的依賴程度也越來越高。在這種情況下,企業(yè)的管理者和用戶對網(wǎng)絡(luò)的性能、運行狀況以及安全性也越來越重視。一個有效且實用的網(wǎng)絡(luò)每時每刻都離不開網(wǎng)絡(luò)管理。 網(wǎng)絡(luò)管理是監(jiān)督、組織和控制網(wǎng)絡(luò)通信服務(wù)和信息處理所必需的各種活動的總稱。除了專門的標準化組織制定了一些標準外,一些網(wǎng)絡(luò)發(fā)展比較早的機構(gòu)與廠家也制定了一些在各自網(wǎng)絡(luò)上應用的管理標準,其中應用最廣泛的是簡單網(wǎng)絡(luò)管理協(xié)議(Simple Network Management Protocol,SNMP)。 SNMP 是由 IETF 提出的面向 Internet的管理協(xié)議,其管理對象包括網(wǎng)橋、路由器、交換機等內(nèi)存和處理能力有限的網(wǎng)絡(luò)互連設(shè)備。SNMP 由于其簡單性得到了業(yè)界廣泛的支持,成為目前最流行的網(wǎng)絡(luò)管理協(xié)議。 本課程設(shè)計的目的是通過編程實現(xiàn) SNMP 協(xié)議,從而加深對 SNMP 協(xié)議的理解。 2) 課程設(shè)計要求 熟悉 SNMP 協(xié)議后,按如下要求編寫程序,實現(xiàn) SNMP 協(xié)議,獲取路由器中的相關(guān)信息。 A)采用 VC 6.0 進行編程。 B)根據(jù)某路由器的 IP 及共同體名,獲得該路由器的系統(tǒng)信息。 C)獲取路由器的 IP 地址信息以及路由表信息;2、 原理分析 網(wǎng)管系統(tǒng)是指課管理真?zhèn)€網(wǎng)絡(luò)及其中的網(wǎng)絡(luò)設(shè)備的軟件系統(tǒng)。網(wǎng)管系統(tǒng)設(shè)計4個方面的內(nèi)容:網(wǎng)管功能、資源、信息及結(jié)構(gòu)。其中,網(wǎng)管功能由ISO網(wǎng)絡(luò)管理功能域定義:網(wǎng)管資源的表示涉及資源的表示方法,主要包括網(wǎng)絡(luò)中硬件,軟件與服務(wù)等資源;網(wǎng)管信息的表示方法與傳輸方式,由網(wǎng)管系統(tǒng)采用的網(wǎng)絡(luò)管理協(xié)議決定;網(wǎng)管系統(tǒng)的結(jié)構(gòu)主要包括兩層結(jié)構(gòu)與三層結(jié)構(gòu)。SNMP網(wǎng)管系統(tǒng)采用客戶機/服務(wù)器工作模式。SNMP網(wǎng)管系統(tǒng)包括兩個組成部分:SNMP客戶機與SNMP服務(wù)器。其中,SNMP客戶機是SNMP服務(wù)的請求者,他安裝在網(wǎng)管管理工作站中,通常被稱為SNMP管理器:SNMP服務(wù)器是SNMP服務(wù)的響應者,它安裝在支持SNMP服務(wù)的網(wǎng)絡(luò)設(shè)備中,通常被稱為SNMP代理。管理信息保存在SNMP代理的MIB中。SNMP服務(wù)在傳輸層采用UDP協(xié)議,在傳輸管理信息之前不需要先建立連接。需要注意的是,SNMP代理主動發(fā)送Trap信息給SNMP管理器。3、 基本思路及關(guān)鍵問題的解決方法顯示相關(guān)信息 結(jié)束開始實例化CSnmp,并用IP和團體名初始化調(diào)用CSnmp類中的Prepare函數(shù),完成SNMP的加載、會話的建立等填充請求列表,列表中存放的實際上是objectID調(diào)用CSnmp類中的GetTable函數(shù),根據(jù)請求列表查路由表信息,放到一個CRouter類里釋放資源1)程序流程圖 程序流程圖如圖1所示: 圖1 程序流程圖 2)基本思路 首先,加載SNMP(包括SNMP主版本號、SNMP副版本號、支持的最高操作標準、默認的實體/上下文傳輸模式以及默認的重發(fā)機制);建立會話,在此過程中得到的會話句柄非常重要;設(shè)置傳輸模式SnmpSetTranslateMode和重傳模式SnmpSetRetransmitMode,這兩個函數(shù)的參數(shù)就是加載SNMP時使用的傳輸模式以及重發(fā)機制;創(chuàng)建實體HSNMP_ENTITY,第一個參數(shù)是步驟2中得到的句柄。IP可以是發(fā)送消息的網(wǎng)絡(luò)設(shè)備的IP地址或接收消息的管理設(shè)備的IP地址,通過需要具體創(chuàng)建實體hSrcEntity、hDestEntity;對源實體和目的實體設(shè)置超時時間和重傳次數(shù)SnmpSetTimeout、SnmpSetRetry;建立上下文句柄HSNMP_CONTEXT、hContext;建立變量捆綁列表;設(shè)置PDU格式,要正確發(fā)送數(shù)據(jù)必須采用特定的PDU格式;發(fā)送SNMP命令SnmpSendMsg;接收SNMP響應;等到響應成功就釋放資源。3)關(guān)鍵問題及解決方案 1.如何設(shè)置PDU格式 PDU是SNMP數(shù)據(jù)包的一個部分,它包括請求標識符、錯誤狀態(tài)、錯誤索引以及捆綁的變量名稱。因此設(shè)置PDU格式是此程序的關(guān)鍵部分。HSNMP_PDU hPdu;hPdu=SnmpCreatePdu(hSession,SNMP_PDU_GETNEXT,0,NULL,NULL,hVbl) 第二個參數(shù)是PDU類型,有多種操作方式:SNMP_PDU_GETNEXT用來在不了解該表時獲取第一個組值,SNMP_PDU_GET用來獲得某個對象某個對象標識符的值;SNMP_PDU_SET用來修改某個對象標識符的值。 2.如何接收和響應SNMP 要接收和響應SNMP就先得創(chuàng)建實體,然后SNMP管理器調(diào)用函數(shù),接收從SNMP代理返回的SNMP響應,SNMP管理器需要解析SNMP響應數(shù)據(jù)包,對各個字段逐個進行分析與判斷,SNMP管理器需要分析錯誤類型字段,判斷是否成功完成對管理對象的操作。 hSrcEntity = SnmpStrToEntity (hSession,(LPCSTR)GetLocalIP()); hDestEntity = SnmpStrToEntity(hSession,ip);4、 源代碼#include winsock2.h#include Winsnmp.h#include #include #include #include #pragma comment(lib,wsnmp32.lib)#pragma comment(lib,ws2_32.lib)using namespace std;typedef vector strvec;typedef vector strvec_vec;class CManagerpublic:CManager(string strIP,string strCommunity); /構(gòu)造函數(shù)CManager(); /析構(gòu)函數(shù)string ValueToString(smiVALUE sValue); /返回值轉(zhuǎn)換 bool InitSnmp(); /用于加載SNMPbool Send(const strvec& strOIDArray,smiINT sPDUType=SNMP_PDU_GETNEXT);bool Receive(HSNMP_VBL& hVbl); /接收應答包bool GetAValue(const string& strOID,string& strResult); /獲取ObjectID值bool GetTable(strvec strOIDArray,strvec_vec& strResultTable); string GetLocalIP(); /獲取本機IP地址void ErrorMessage(string strMessage); /輸出錯誤信息void SetEvent(); protected:HSNMP_SESSION m_hSession; /會話句柄HSNMP_CONTEXT m_hContext; /上下文句柄static SNMPAPI_STATUS CALLBACK Callback( HSNMP_SESSION hSession, /WinSNMP會話句柄 HWND hWnd, /處理通知窗口的句柄 UINT wMsg, /窗口消息通知碼 WPARAM wParam, /消息類型 LPARAM lParam, /PDU的請求標識符 LPVOID lpClientData /可選的自定義數(shù)據(jù));private:smiUINT32 m_nMajorVersion; /WinSNMP API主版本smiUINT32 m_nMinorVersion; /WinSNMP API副版本smiUINT32 m_nLevel; /支持最高的操作標準smiUINT32 m_nTranslateMode; /默認實體/上下文模式smiUINT32 m_nRetransmitMode; /默認的重發(fā)機制string m_IP; /IP地址smiOCTETS m_Community; /團體名HANDLE m_hEvent;/ 構(gòu)造函數(shù)CManager:CManager(string strIP,string strCommunity):m_nMajorVersion(0),m_nMinorVersion(0),m_nLevel(0),m_nTranslateMode(0),m_nRetransmitMode(0),m_IP(strIP)m_Community.len=strCommunity.length(); m_Community.ptr=new smiBYTEstrCommunity.length(); memcpy(m_Community.ptr,strCommunity.c_str(),strCommunity.length(); m_hEvent=CreateEvent(NULL,true,false,NULL);/析構(gòu)函數(shù)CManager:CManager()SnmpFreeContext(m_hContext); SnmpClose(m_hSession); SnmpCleanup(); delete m_Community.ptr;/SNMP初始化函數(shù)bool CManager:InitSnmp()/加載SNMP if(SnmpStartup(&m_nMajorVersion,&m_nMinorVersion,&m_nLevel,&m_nTranslateMode,&m_nRetransmitMode)=SNMPAPI_FAILURE) ErrorMessage(startup SNMP error!); return false; /設(shè)置傳輸模式 if (SnmpSetTranslateMode(m_nTranslateMode)=SNMPAPI_FAILURE) ErrorMessage(Set transfer mode error!); return false; /設(shè)置重傳模式 if (SnmpSetRetransmitMode(m_nRetransmitMode)=SNMPAPI_FAILURE) ErrorMessage(Set retransmission mode error!); return false; /建立會話 m_hSession=SnmpCreateSession(NULL,NULL,CManager:Callback,(LPVOID)this); if(m_hSession=SNMPAPI_FAILURE) ErrorMessage(Set conversation error!); return false; /建立實體 HSNMP_ENTITY hEntity; if(hEntity=SnmpStrToEntity(m_hSession,m_IP.c_str()=SNMPAPI_FAILURE) ErrorMessage(Creat entity error!); return false; /建立上下文句柄 if(m_hContext=SnmpStrToContext(m_hSession,&m_Community)=SNMPAPI_FAILURE) ErrorMessage(Create context handle error!); return false; /設(shè)置超時時間 if (SnmpSetTimeout(hEntity,10)=SNMPAPI_FAILURE) ErrorMessage(Set timeout error!); return false; /設(shè)置重傳次數(shù) if (SnmpSetRetry(hEntity,1)=SNMPAPI_FAILURE) ErrorMessage(Set retransmissions error!); return false; return true;/SNMP消息發(fā)送函數(shù)bool CManager:Send(const strvec& strOIDArray,smiINT sPDUType)HSNMP_VBL hVbl;HSNMP_PDU hPdu;smiOID sOid;HSNMP_ENTITY hSrcEntity,hDestEntity;/創(chuàng)建源主機和目的主機實體句柄hSrcEntity = SnmpStrToEntity(m_hSession,GetLocalIP().c_str();hDestEntity = SnmpStrToEntity(m_hSession,m_IP.c_str();/創(chuàng)建變量綁定列表if(hVbl = SnmpCreateVbl(m_hSession,NULL,NULL) = SNMPAPI_FAILURE)return false;/點分十進制串轉(zhuǎn)換成二進制格式for(strvec:const_iterator it=strOIDArray.begin();it!=strOIDArray.end();it+)SnmpStrToOid(*it).c_str(),&sOid);SnmpSetVb(hVbl,0,&sOid,NULL);/將數(shù)據(jù)轉(zhuǎn)換成特定PDU格式if(hPdu = SnmpCreatePdu(m_hSession,sPDUType,0,NULL,NULL,hVbl) = SNMPAPI_FAILURE)return false;/發(fā)送PDUif(SnmpSendMsg(m_hSession,hSrcEntity,hDestEntity,m_hContext,hPdu) = SNMPAPI_FAILURE)return false;/釋放句柄SnmpFreeEntity(hSrcEntity);SnmpFreeEntity(hDestEntity);SnmpFreePdu(hPdu);SnmpFreePdu(hVbl);return true;/SNMP消息接收函數(shù)bool CManager:Receive(HSNMP_VBL& hVbl)WaitForSingleObject(m_hEvent,INFINITE);ResetEvent(m_hEvent);HSNMP_ENTITY hSrcEntity;HSNMP_ENTITY hDestEntity;HSNMP_CONTEXT hContext;HSNMP_PDU hPdu;/接收到消息if(SnmpRecvMsg(m_hSession,&hSrcEntity,&hDestEntity,&hContext,&hPdu) = SNMPAPI_FAILURE)return false;smiINT PDU_type;smiINT error_status;smiINT error_index;/提取PDU中的數(shù)據(jù)if(SnmpGetPduData(hPdu,&PDU_type,NULL,&error_status,&error_index,&hVbl) = SNMPAPI_FAILURE)return false;return true;/SNMP數(shù)值轉(zhuǎn)換函數(shù)string CManager:ValueToString(smiVALUE sValue)char cBuffer1500;memset(cBuffer,0,1500);switch(sValue.syntax)case SNMP_SYNTAX_NSAPADDR:case SNMP_SYNTAX_IPADDR:sprintf(cBuffer,%d.%d.%d.%d,sValue.value.string.ptr0,sValue.value.string.ptr1,sValue.value.string.ptr2,sValue.value.string.ptr3);break;case SNMP_SYNTAX_OPAQUE:case SNMP_SYNTAX_OCTETS:if(sValue.value.string.len=0)sprintf(cBuffer,OCTETS NULL);elsememset(sValue.value.string.ptr+sValue.value.string.len,0,1);sprintf(cBuffer,%s,sValue.value.string.ptr);break;case SNMP_SYNTAX_TIMETICKS:int iHours,iMinutes,iSeconds;long lUptime;lUptime=sValue.value.uNumber/100;iHours=(int)(lUptime/3600);iMinutes=(int)(lUptime%3600)/60);iSeconds=(int)(lUptime%60);sprintf(cBuffer,%d時,%d分,%d秒,iHours,iMinutes,iSeconds);break;case SNMP_SYNTAX_INT:sprintf(cBuffer,%d,sValue.value.sNumber);break;case SNMP_SYNTAX_UINT32:case SNMP_SYNTAX_CNTR32:case SNMP_SYNTAX_GAUGE32:sprintf(cBuffer,%U,sValue.value.uNumber);break;default:sprintf(cBuffer,NULL);break;return string(cBuffer);/獲得路由器信息函數(shù)bool CManager:GetAValue(const string& strOID,string& strResult)HSNMP_VBL hVbl;smiOID sOIDRecv;smiVALUE sValue;int iCount;strvec strOIDArray;strOIDArray.push_back(strOID+.0);/發(fā)送請求列表string沒有成功if(!Send(strOIDArray,SNMP_PDU_GET)return false;/沒有接收到應答if(!Receive(hVbl)return false;/計算返回Vbl的行數(shù)iCount = SnmpCountVbl(hVbl);if(iCount!=1)strResult=SnmpCounVbl error!;return false;/取返回結(jié)果if(SnmpGetVb(hVbl,1,&sOIDRecv,&sValue) = SNMPAPI_FAILURE)strResult=SnmpGetVb error!;return false;strResult=ValueToString(sValue);SnmpFreeVbl(hVbl);return true;/獲得路由表信息函數(shù)bool CManager:GetTable(strvec strOIDArray, strvec_vec& strResultTable)long lIfEnd;HSNMP_VBL hVbl;smiOID sOIDSend;smiOID sOIDRecv;smiVALUE sValue;int iCount,iOIDLen;char cBuffer100;if (strOIDArray.empty()return false;/計算OID標識符的長度iOIDLen=count(strOIDArray0).begin(),(strOIDArray0).end(),.)+1;while(true)/發(fā)送請求列表string沒有成功if(!Send(strOIDArray)return false;/沒有接收到應答if(!Receive (hVbl)return false;/計算返回Vbl的行數(shù)iCount = SnmpCountVbl(hVbl);for(int i=0;ih_addr_list0);return HostIP;/錯誤信息函數(shù)void CManager:ErrorMessage(string strMessage)coutstrMessageSetEvent();return 1;/ Main.CPP: 主函數(shù)的實現(xiàn)/#include Manager.hvoid main(int argc,char *argv)/檢查輸入命令格式if(argc!=3)coutPlease input command:SnmpManager ip_address communityendl;return;/初始化CManger對象 CManager cManger(argv1,argv2);bool Status=cManger.InitSnmp();/輸出路由器的基本信息cout-GetValue Text-endl;string Result;if(Status=cManger.GetAValue(1.3.6.1.2.1.1.1,Result)=false)cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)管理服務(wù)協(xié)議細則
- 公文寫作的重要性與2025年試題及答案
- 通信行業(yè)智能化通信設(shè)備維護與升級方案
- 車位租賃共享協(xié)議
- 行政管理學考試思維導圖及試題及答案
- 自考行政管理知識總結(jié)試題及答案
- 行政管理學知識更新試題及答案
- 現(xiàn)代管理學思維模式的試題及答案
- 2025企業(yè)長期借款合同模板
- 2025年挖掘機租賃合同
- 醫(yī)院科室6S管理制度
- RULES OF ORIGIN 原產(chǎn)地規(guī)則
- 國內(nèi)旅游出團通知書(新版)
- LETTEROFINTENTION意向書范本
- 國內(nèi)各航空公司差異化服務(wù)
- 《山東省自然科學基金資助項目年度進展報告》
- 發(fā)展與教育心理學個別差異
- 2022年重慶市建筑安全員A證考試近年真題匯總(含答案解析)
- 太倉德資企業(yè)
- 電網(wǎng)有限公司電網(wǎng)建設(shè)項目檔案管理辦法
- 簡易離職申請
評論
0/150
提交評論