收藏 分享(赏)

SNMP管理器编程.doc

上传人:HR专家 文档编号:5998213 上传时间:2019-03-23 格式:DOC 页数:12 大小:98KB
下载 相关 举报
SNMP管理器编程.doc_第1页
第1页 / 共12页
SNMP管理器编程.doc_第2页
第2页 / 共12页
SNMP管理器编程.doc_第3页
第3页 / 共12页
SNMP管理器编程.doc_第4页
第4页 / 共12页
SNMP管理器编程.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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

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

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

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

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

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

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

8、理对象的操作。hSrcEntity = SnmpStrToEntity (hSession,(LPCSTR)GetLocalIP());hDestEntity = SnmpStrToEntity(hSession,ip);4、源代码3#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 strv

9、ec;typedef vector strvec_vec;class CManagerpublic:CManager(string strIP,string strCommunity); /构造函数CManager(); /析构函数string ValueToString(smiVALUE sValue); /返回值转换 bool InitSnmp(); /用于加载SNMPbool Send(const strvecbool Receive(HSNMP_VBL /接收应答包bool GetAValue(const string /获取ObjectID值bool GetTable(strvec

10、strOIDArray,strvec_vec 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, /窗口消

11、息通知码WPARAM wParam, /消息类型LPARAM lParam, /PDU的请求标识符LPVOID lpClientData /可选的自定义数据);private:smiUINT32 m_nMajorVersion; /WinSNMP API主版本smiUINT32 m_nMinorVersion; /WinSNMP API副版本smiUINT32 m_nLevel; /支持最高的操作标准smiUINT32 m_nTranslateMode; /默认实体/上下文模式smiUINT32 m_nRetransmitMode; /默认的重发机制string m_IP; /IP地址smiO

12、CTETS m_Community; /团体名4HANDLE 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.length();m_Community.ptr=new smiBYTEstrCommunity.length();memcpy(m_Comm

13、unity.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 CManager:InitSnmp()/加载SNMPif(SnmpStartup(return false;/设置传输模式if (SnmpSetTransl

14、ateMode(m_nTranslateMode)=SNMPAPI_FAILURE)ErrorMessage(“Set transfer mode error!“);return false;/设置重传模式if (SnmpSetRetransmitMode(m_nRetransmitMode)=SNMPAPI_FAILURE)ErrorMessage(“Set retransmission mode error!“);return false;5/建立会话m_hSession=SnmpCreateSession(NULL,NULL,CManager:Callback,(LPVOID)this)

15、;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,return false;/设置超时时间if (

16、SnmpSetTimeout(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 strvecHSNMP_PDU hPdu;smiOID sOid;HSNMP_ENTITY hSrcEnti

17、ty,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;/点分十进制串转换成二进制格式for(strvec:const_iterator 6it=strOIDArray.begin();it!=

18、strOIDArray.end();it+)SnmpStrToOid(*it).c_str(),SnmpSetVb(hVbl,0,/将数据转换成特定PDU格式if(hPdu = SnmpCreatePdu(m_hSession,sPDUType,0,NULL,NULL,hVbl) = SNMPAPI_FAILURE)return false;/发送PDUif(SnmpSendMsg(m_hSession,hSrcEntity,hDestEntity,m_hContext,hPdu) = SNMPAPI_FAILURE)return false;/释放句柄SnmpFreeEntity(hSrcE

19、ntity);SnmpFreeEntity(hDestEntity);SnmpFreePdu(hPdu);SnmpFreePdu(hVbl);return true;/SNMP消息接收函数bool CManager:Receive(HSNMP_VBLResetEvent(m_hEvent);HSNMP_ENTITY hSrcEntity;HSNMP_ENTITY hDestEntity;HSNMP_CONTEXT hContext;HSNMP_PDU hPdu;/接收到消息if(SnmpRecvMsg(m_hSession,smiINT PDU_type;smiINT error_status

20、;smiINT error_index;/提取PDU中的数据if(SnmpGetPduData(hPdu,return true;/SNMP数值转换函数string CManager:ValueToString(smiVALUE sValue)char cBuffer1500;memset(cBuffer,0,1500);7switch(sValue.syntax)case SNMP_SYNTAX_NSAPADDR:case SNMP_SYNTAX_IPADDR:sprintf(cBuffer,“%d.%d.%d.%d“,sValue.value.string.ptr0,sValue.valu

21、e.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

22、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

23、.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 stringsmiOID sOIDRecv;smiVALUE sValue;8int iCount;strvec strO

24、IDArray;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 error!“;return false;/取返回结果if(SnmpGetVb(hVbl,1,return false;strResult=ValueToStr

25、ing(sValue);SnmpFreeVbl(hVbl);return true;/获得路由表信息函数bool CManager:GetTable(strvec strOIDArray, strvec_vecHSNMP_VBL hVbl;smiOID sOIDSend;smiOID sOIDRecv;smiVALUE sValue;int iCount,iOIDLen;char cBuffer100;if (strOIDArray.empty()return false;/计算OID标识符的长度iOIDLen=count(strOIDArray0).begin(),(strOIDArray0

26、).end(),.)+1;while(true)/发送请求列表string没有成功if(!Send(strOIDArray)return false;/没有接收到应答if(!Receive (hVbl)9return false;/计算返回Vbl的行数iCount = SnmpCountVbl(hVbl);for(int i=0;ih_addr_list0);return HostIP;/错误信息函数void CManager:ErrorMessage(string strMessage)coutSetEvent();return 1;/ Main.CPP: 主函数的实现/#include “

27、Manager.h“void main(int argc,char *argv)/检查输入命令格式if(argc!=3)cout“Please input command:SnmpManager ip_address community“endl;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

28、“,Result)=false)cout“GetAnValue error!“endl;elsecoutResultendl;/输出路由器的路由表信息cout“-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

29、.1.2.1.4.21.1.8“);RouteOidArray.push_back (“1.3.6.1.2.1.4.21.1.11“);strvec_vec IpResultTable(RouteOidArray.size();if (Status=cManger.GetTable(RouteOidArray,IpResultTable)=false)cout“GetTable error“endl;elsefor(strvec_vec:iterator it1=IpResultTable.begin();it1!=IpResultTable.end();it1+)strvec AGroup=

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

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

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报