SNMP管理器编程.docx

上传人:小飞机 文档编号:3165976 上传时间:2023-03-11 格式:DOCX 页数:17 大小:43.04KB
返回 下载 相关 举报
SNMP管理器编程.docx_第1页
第1页 / 共17页
SNMP管理器编程.docx_第2页
第2页 / 共17页
SNMP管理器编程.docx_第3页
第3页 / 共17页
SNMP管理器编程.docx_第4页
第4页 / 共17页
SNMP管理器编程.docx_第5页
第5页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《SNMP管理器编程.docx》由会员分享,可在线阅读,更多相关《SNMP管理器编程.docx(17页珍藏版)》请在三一办公上搜索。

1、SNMP管理器编程一、课程设计目的以及要求 1) 课程设计目的 随着网络规模的不断扩大,网络结构也变得越来越复杂。用户对网络应用的需求不断提高,企业和用户对计算机网络的依赖程度也越来越高。在这种情况下,企业的管理者和用户对网络的性能、运行状况以及安全性也越来越重视。一个有效且实用的网络每时每刻都离不开网络管理。 网络管理是监督、组织和控制网络通信服务和信息处理所必需的各种活动的总称。除了专门的标准化组织制定了一些标准外,一些网络发展比较早的机构与厂家也制定了一些在各自网络上应用的管理标准,其中应用最广泛的是简单网络管理协议(Simple Network Management Protocol,

2、SNMP)。 SNMP 是由 IETF 提出的面向 Internet的管理协议,其管理对象包括网桥、路由器、交换机等内存和处理能力有限的网络互连设备。SNMP 由于其简单性得到了业界广泛的支持,成为目前最流行的网络管理协议。 本课程设计的目的是通过编程实现 SNMP 协议,从而加深对 SNMP 协议的理解。 2) 课程设计要求 熟悉 SNMP 协议后,按如下要求编写程序,实现 SNMP 协议,获取路由器中的相关信息。 A)采用 VC 6.0 进行编程。 B)根据某路由器的 IP 及共同体名,获得该路由器的系统信息。 C)获取路由器的 IP 地址信息以及路由表信息; 二、原理分析 网管系统是指课

3、管理真个网络及其中的网络设备的软件系统。网管系统设计4个方面的内容:网管功能、资源、信息及结构。其中,网管功能由ISO网络管理功能域定义:网管资源的表示涉及资源的表示方法,主要包括网络中硬件,软件与服务等资源;网管信息的表示方法与传输方式,由网管系统采用的网络管理协议决定;网管系统的结构主要包括两层结构与三层结构。 0 SNMP网管系统采用客户机/服务器工作模式。SNMP网管系统包括两个组成部分:SNMP客户机与SNMP服务器。其中,SNMP客户机是SNMP服务的请求者,他安装在网管管理工作站中,通常被称为SNMP管理器:SNMP服务器是SNMP服务的响应者,它安装在支持SNMP服务的网络设备

4、中,通常被称为SNMP代理。管理信息保存在SNMP代理的MIB中。SNMP服务在传输层采用UDP协议,在传输管理信息之前不需要先建立连接。需要注意的是,SNMP代理主动发送Trap信息给SNMP管理器。 三、基本思路及关键问题的解决方法 1)程序流程图 程序流程图如图1所示: 1 开始 实例化CSnmp,并用IP和团体名初始化 调用CSnmp类中的Prepare函数,完成SNMP的加载、会话的建立等 填充请求列表,列表中存放的实际上是objectID 调用CSnmp类中的GetTable函数,根据请求列表查路由表信息,放到一个CRouter类里 释放资源 显示相关信息 结束 图1 程序流程图

5、2)基本思路 首先,加载SNMP(包括SNMP主版本号、SNMP副版本号、支持的最高操作标准、默认的实体/上下文传输模式以及默认的重发机制);建立会话,在此过程中得到的会话句柄非常重要;设置传输模式SnmpSetTranslateMode和重传模式SnmpSetRetransmitMode,这两个函数的参数就是加载SNMP时使用的传输模式以及重发机制;创建实体HSNMP_ENTITY,第一个参数是步骤2中得到的句柄。IP可以是发送消息的网络设备的IP地址或接收消息的管理设备的IP地址,通过需要具体创建实体hSrcEntity、hDestEntity;对源实体和目的实体设置超时时间和重传次数Sn

6、mpSetTimeout、SnmpSetRetry;建立上下文句柄HSNMP_CONTEXT、hContext;建立变量捆绑列表;设置PDU格式,要正确发送数据必须采用特定的PDU格式;发送SNMP命令SnmpSendMsg;接收SNMP响应;等到响应成功就释放资源。 3)关键问题及解决方案 1.如何设置PDU格式 PDU是SNMP数据包的一个部分,它包括请求标识符、错误状态、错误索引以及捆绑的变量名称。因此设置PDU格式是此程序的关键部分。 HSNMP_PDU hPdu; hPdu=SnmpCreatePdu(hSession,SNMP_PDU_GETNEXT,0,NULL,NULL,hVb

7、l) 第二个参数是PDU类型,有多种操作方式:SNMP_PDU_GETNEXT用来在不了解该表时获取第一个组值,SNMP_PDU_GET用来获得某个对象某个对象标识符的值;SNMP_PDU_SET用来修改某个对象标识符的值。 2.如何接收和响应SNMP 要接收和响应SNMP就先得创建实体,然后SNMP管理器调用函数,接收从SNMP代理返回的SNMP响应,SNMP管理器需要解析SNMP响应数据包,对各个字段逐个进行分析与判断,SNMP管理器需要分析错误类型字段,判断是否成功完成对管理对象的操作。 hSrcEntity = SnmpStrToEntity (hSession,GetLocalIP)

8、; hDestEntity = SnmpStrToEntity(hSession,ip); 四、源代码 2 #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 CManager public: CManager(str

9、ing strIP,string strCommunity); /构造函数 CManager; /析构函数 string ValueToString(smiVALUE sValue); /返回值转换 bool InitSnmp; /用于加载SNMP bool Send(const strvec& strOIDArray,smiINT sPDUType=SNMP_PDU_GETNEXT); bool Receive(HSNMP_VBL& hVbl); /接收应答包 bool GetAValue(const string& strOID,string& strResult); /获取ObjectI

10、D值 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, /Wi

11、nSNMP会话句柄 HWND hWnd, /处理通知窗口的句柄 UINT wMsg, /窗口消息通知码 WPARAM wParam, /消息类型 LPARAM lParam, /PDU的请求标识符 LPVOID lpClientData /可选的自定义数据 ); private: smiUINT32 m_nMajorVersion; /WinSNMP API主版本 smiUINT32 m_nMinorVersion; /WinSNMP API副版本 smiUINT32 m_nLevel; /支持最高的操作标准 smiUINT32 m_nTranslateMode; /默认实体/上下文模式 sm

12、iUINT32 m_nRetransmitMode; /默认的重发机制 string m_IP; /IP地址 smiOCTETS m_Community; /团体名 3 HANDLE m_hEvent; ; / 构造函数 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

13、.length; m_Community.ptr=new smiBYTEstrCommunity.length; memcpy(m_Community.ptr,strCommunity.c_str,strCommunity.length); m_hEvent=CreateEvent(NULL,true,false,NULL); /析构函数 CManager:CManager SnmpFreeContext(m_hContext); SnmpClose(m_hSession); SnmpCleanup; delete m_Community.ptr; /SNMP初始化函数 bool CManag

14、er:InitSnmp /加载SNMP if(SnmpStartup(&m_nMajorVersion,&m_nMinorVersion,&m_nLevel,&m_nTranslateMode,&m_nRetransmitMode)=SNMPAPI_FAILURE) ErrorMessage(startup SNMP error!); return false; /设置传输模式 if (SnmpSetTranslateMode(m_nTranslateMode)=SNMPAPI_FAILURE) ErrorMessage(Set transfer mode error!); return fa

15、lse; /设置重传模式 if (SnmpSetRetransmitMode(m_nRetransmitMode)=SNMPAPI_FAILURE) ErrorMessage(Set retransmission mode error!); return false; 4 /建立会话 m_hSession=SnmpCreateSession(NULL,NULL,CManager:Callback,(LPVOID)this); if(m_hSession=SNMPAPI_FAILURE) ErrorMessage(Set conversation error!); return false; /

16、建立实体 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; /设置超时时间 if (SnmpS

17、etTimeout(hEntity,10)=SNMPAPI_FAILURE) ErrorMessage(Set timeout error!); return false; /设置重传次数 if (SnmpSetRetry(hEntity,1)=SNMPAPI_FAILURE) ErrorMessage(Set retransmissions error!); return false; return true; /SNMP消息发送函数 bool CManager:Send(const strvec& strOIDArray,smiINT sPDUType) HSNMP_VBL hVbl; H

18、SNMP_PDU hPdu; smiOID sOid; HSNMP_ENTITY hSrcEntity,hDestEntity; /创建源主机和目的主机实体句柄 hSrcEntity = SnmpStrToEntity(m_hSession,GetLocalIP.c_str); hDestEntity = SnmpStrToEntity(m_hSession,m_IP.c_str); /创建变量绑定列表 if(hVbl = SnmpCreateVbl(m_hSession,NULL,NULL) = SNMPAPI_FAILURE) return false; /点分十进制串转换成二进制格式 f

19、or(strvec:const_iterator 5 it=strOIDArray.begin;it!=strOIDArray.end;it+) SnmpStrToOid(*it).c_str,&sOid); SnmpSetVb(hVbl,0,&sOid,NULL); /将数据转换成特定PDU格式 if(hPdu = SnmpCreatePdu(m_hSession,sPDUType,0,NULL,NULL,hVbl) SNMPAPI_FAILURE) return false; /发送PDU if(SnmpSendMsg(m_hSession,hSrcEntity,hDestEntity,m

20、_hContext,hPdu) SNMPAPI_FAILURE) return false; /释放句柄 SnmpFreeEntity(hSrcEntity); SnmpFreeEntity(hDestEntity); SnmpFreePdu(hPdu); SnmpFreePdu(hVbl); return true; /SNMP消息接收函数 bool CManager:Receive(HSNMP_VBL& hVbl) WaitForSingleObject(m_hEvent,INFINITE); ResetEvent(m_hEvent); HSNMP_ENTITY hSrcEntity; H

21、SNMP_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中的数据 if(SnmpGetPduData(hPdu,&PDU_type,NULL,&error_status,&error_i

22、ndex,&hVbl) SNMPAPI_FAILURE) return false; return true; /SNMP数值转换函数 string CManager:ValueToString(smiVALUE sValue) char cBuffer1500; memset(cBuffer,0,1500); 6 = = = = switch(sValue.syntax) case SNMP_SYNTAX_NSAPADDR: case SNMP_SYNTAX_IPADDR: sprintf(cBuffer,%d.%d.%d.%d,sValue.value.string.ptr0,sValue

23、.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); else memset(sValue.value.string.ptr+sValue.value.string.len,0,1); sprintf(cBuffer,%s,sValue.value.string.ptr); b

24、reak; 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(cBuffe

25、r,%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); /获得路由器信息函数 bool CManager:GetAValue(const string& strOID,string& strResult) HS

26、NMP_VBL hVbl; smiOID sOIDRecv; smiVALUE sValue; 7 int iCount; strvec strOIDArray; strOIDArray.push_back(strOID+.0); /发送请求列表string没有成功 if(!Send(strOIDArray,SNMP_PDU_GET) return false; /没有接收到应答 if(!Receive(hVbl) return false; /计算返回Vbl的行数 iCount = SnmpCountVbl(hVbl); if(iCount!=1) strResult=SnmpCounVbl

27、 error!; return false; /取返回结果 if(SnmpGetVb(hVbl,1,&sOIDRecv,&sValue) = SNMPAPI_FAILURE) strResult=SnmpGetVb error!; return false; strResult=ValueToString(sValue); SnmpFreeVbl(hVbl); return true; /获得路由表信息函数 bool CManager:GetTable(strvec strOIDArray, strvec_vec& strResultTable) long lIfEnd; HSNMP_VBL

28、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) /发送请求列表string没有成功 if(!Send(strOIDArray) return false; /没有接收到应答 if(!Receive (hVbl) 8 r

29、eturn false; /计算返回Vbl的行数 iCount = SnmpCountVbl(hVbl); for(int i=0;ih_addr_list0); return HostIP; /错误信息函数 void CManager:ErrorMessage(string strMessage) coutstrMessageSetEvent; return 1; / Main.CPP: 主函数的实现 /#include Manager.h void main(int argc,char *argv) /检查输入命令格式 if(argc!=3) coutPlease input comman

30、d: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) coutGetAnValue error!endl; else coutResultendl; /输出路由器的路由表信息 cout-

31、GetTable Test-endl; strvec RouteOidArray; RouteOidArray.push_back (1.3.6.1.2.1.4.21.1.1); RouteOidArray.push_back (1.3.6.1.2.1.4.21.1.2); RouteOidArray.push_back (1.3.6.1.2.1.4.21.1.7); RouteOidArray.push_back (1.3.6.1.2.1.4.21.1.8); RouteOidArray.push_back (1.3.6.1.2.1.4.21.1.11); strvec_vec IpResu

32、ltTable(RouteOidArray.size); if (Status=cManger.GetTable(RouteOidArray,IpResultTable)=false) coutGetTable errorendl; else for(strvec_vec:iterator it1=IpResultTable.begin;it1!=IpResultTable.end;it1+) strvec AGroup=*it1; for(strvec:iterator it2=AGroup.begin;it2!=AGroup.end;it2+) 10 cout*it2 ; coutendl

33、; 五、调试过程中出现的问题以及解决方法 在测试过程中,输出路由器的基本信息中,函数If (Status = cManger.GetAValue (1.3.6.1.2.1.1.1,Result)总是返回FALSE,所以不能输出路由器基本信息表。运行结果如图2所示。 图2 运行结果 六、总结及心得体会 在做本试验的代码调试阶段,遇到过很多的Bug,然而在老师和同学的帮助下,虽然代码运行时没有了问题,但运行出的结果却不是我们想要的,总的说,这是我们这次试验做的最不足的地方。 不过通过这次试验,我掌握了网络管理软件和流量分析软件在局域网中的应用,基本配置肯操作技能,掌握交换机SNMP配置,端口镜像以及流量检测等技术在局域网中的应用和配置方法 11

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号