SNMP管理器编程Word格式.docx
《SNMP管理器编程Word格式.docx》由会员分享,可在线阅读,更多相关《SNMP管理器编程Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
网管系统是指课管理真个网络及其中的网络设备的软件系统。
网管系统设计4个方面的内容:
网管功能、资源、信息及结构。
其中,网管功能由ISO网络管理功能域定义:
网管资源的表示涉及资源的表示方法,主要包括网络中硬件,软件与服务等资源;
网管信息的表示方法与传输方式,由网管系统采用的网络管理协议决定;
网管系统的结构主要包括两层结构与三层结构。
SNMP网管系统采用客户机/服务器工作模式。
SNMP网管系统包括两个组成部分:
SNMP客户机与SNMP服务器。
其中,SNMP客户机是SNMP服务的请求者,他安装在网管管理工作站中,通常被称为SNMP管理器:
SNMP服务器是SNMP服务的响应者,它安装在支持SNMP服务的网络设备中,通常被称为SNMP代理。
管理信息保存在SNMP代理的MIB中。
SNMP服务在传输层采用UDP协议,在传输管理信息之前不需要先建立连接。
需要注意的是,SNMP代理主动发送Trap信息给SNMP管理器。
3、基本思路及关键问题的解决方法
1)程序流程图
程序流程图如图1所示:
图1程序流程图
2)基本思路
首先,加载SNMP(包括SNMP主版本号、SNMP副版本号、支持的最高操作标准、默认的实体/上下文传输模式以及默认的重发机制);
建立会话,在此过程中得到的会话句柄非常重要;
设置传输模式SnmpSetTranslateMode和重传模式SnmpSetRetransmitMode,这两个函数的参数就是加载SNMP时使用的传输模式以及重发机制;
创建实体HSNMP_ENTITY,第一个参数是步骤2中得到的句柄。
IP可以是发送消息的网络设备的IP地址或接收消息的管理设备的IP地址,通过需要具体创建实体——hSrcEntity、hDestEntity;
对源实体和目的实体设置超时时间和重传次数——SnmpSetTimeout、SnmpSetRetry;
建立上下文句柄——HSNMP_CONTEXT、hContext;
建立变量捆绑列表;
设置PDU格式,要正确发送数据必须采用特定的PDU格式;
发送SNMP命令——SnmpSendMsg;
接收SNMP响应;
等到响应成功就释放资源。
3)关键问题及解决方案
1.如何设置PDU格式
PDU是SNMP数据包的一个部分,它包括请求标识符、错误状态、错误索引以及捆绑的变量名称。
因此设置PDU格式是此程序的关键部分。
HSNMP_PDUhPdu;
hPdu=SnmpCreatePdu(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管理器需要分析错误类型字段,判断是否成功完成对管理对象的操作。
hSrcEntity=SnmpStrToEntity(hSession,(LPCSTR)GetLocalIP());
hDestEntity=SnmpStrToEntity(hSession,ip);
4、源代码
#include"
winsock2.h"
Winsnmp.h"
#include<
string>
vector>
algorithm>
iostream>
#pragmacomment(lib,"
wsnmp32.lib"
)
ws2_32.lib"
usingnamespacestd;
typedefvector<
strvec;
strvec>
strvec_vec;
classCManager
{public:
CManager(stringstrIP,stringstrCommunity);
//构造函数
~CManager();
//析构函数
stringValueToString(smiVALUEsValue);
//返回值转换
boolInitSnmp();
//用于加载SNMP
boolSend(conststrvec&
strOIDArray,smiINTsPDUType=SNMP_PDU_GETNEXT);
boolReceive(HSNMP_VBL&
hVbl);
//接收应答包
boolGetAValue(conststring&
strOID,string&
strResult);
//获取ObjectID值
boolGetTable(strvecstrOIDArray,strvec_vec&
strResultTable);
stringGetLocalIP();
//获取本机IP地址
voidErrorMessage(stringstrMessage);
//输出错误信息
voidSetEvent();
protected:
HSNMP_SESSIONm_hSession;
//会话句柄
HSNMP_CONTEXTm_hContext;
//上下文句柄
staticSNMPAPI_STATUSCALLBACKCallback
(
HSNMP_SESSIONhSession,//WinSNMP会话句柄
HWNDhWnd,//处理通知窗口的句柄
UINTwMsg,//窗口消息通知码
WPARAMwParam,//消息类型
LPARAMlParam,//PDU的请求标识符
LPVOIDlpClientData//可选的自定义数据
);
private:
smiUINT32m_nMajorVersion;
//WinSNMPAPI主版本
smiUINT32m_nMinorVersion;
//WinSNMPAPI副版本
smiUINT32m_nLevel;
//支持最高的操作标准
smiUINT32m_nTranslateMode;
//默认实体/上下文模式
smiUINT32m_nRetransmitMode;
//默认的重发机制
stringm_IP;
//IP地址
smiOCTETSm_Community;
//团体名
HANDLEm_hEvent;
};
//构造函数
CManager:
:
CManager(stringstrIP,stringstrCommunity):
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=newsmiBYTE[strCommunity.length()];
memcpy(m_Community.ptr,strCommunity.c_str(),strCommunity.length());
m_hEvent=CreateEvent(NULL,true,false,NULL);
}
//析构函数
~CManager()
{SnmpFreeContext(m_hContext);
SnmpClose(m_hSession);
SnmpCleanup();
delete[]m_Community.ptr;
//SNMP初始化函数
boolCManager:
InitSnmp()
{
//加载SNMP
if(SnmpStartup(&
m_nMajorVersion,&
m_nMinorVersion,&
m_nLevel,&
m_nTranslateMode,&
m_nRetransmitMode)==SNMPAPI_FAILURE)
{ErrorMessage("
startupSNMPerror!
"
);
returnfalse;
}
//设置传输模式
if(SnmpSetTranslateMode(m_nTranslateMode)==SNMPAPI_FAILURE)
Settransfermodeerror!
//设置重传模式
if(SnmpSetRetransmitMode(m_nRetransmitMode)==SNMPAPI_FAILURE)
Setretransmissionmodeerror!
//建立会话
m_hSession=SnmpCreateSession(NULL,NULL,CManager:
Callback,(LPVOID)this);
if(m_hSession==SNMPAPI_FAILURE)
Setconversationerror!
//建立实体
HSNMP_ENTITYhEntity;
if((hEntity=SnmpStrToEntity(m_hSession,m_IP.c_str()))==SNMPAPI_FAILURE)
Createntityerror!
!
//建立上下文句柄
if((m_hContext=SnmpStrToContext(m_hSession,&
m_Community))==SNMPAPI_FAILURE)
{ErrorMessag