《SNMP管理器编程》由会员分享,可在线阅读,更多相关《SNMP管理器编程(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 false; /设置重传模式 if (SnmpSetRetransmitMode(m_nRetransmitMode)=SNMPAPI_FAILURE) ErrorMessage(Set retrans