📄 snmp探测代码.txt
字号:
#ifndef _SNMPEXTOOLS_H
#define _SNMPEXTOOLS_H
#include "winsnmp.h"
#include "winsock.h"
#pragma comment(lib, "wsnmp32.lib" )
#pragma comment(lib, "ws2_32.lib" )
/***************************************************/
#define MAX_UDP 10
#define MAX_VBL 10
#define lMsg(x) ::MessageBox(NULL, x, "信息", NULL)
//=================================一些结构体
class CSendInfo
{
public:
CSendInfo();
~CSendInfo();
public:
//对方的实体
HSNMP_ENTITY hAgentEntity;
//自己的实体
HSNMP_ENTITY hManagerEntity;
//上下文描述
HSNMP_CONTEXT hViewContext;
//发送包类型
int nPduType;
//----------------如果hPdu不为空,则用它来发送,而忽略hVbl和vblValue、vblOid
//PDU句柄
HSNMP_PDU hPdu;
//每个VBL对应的OID
smiOID vblOid[MAX_VBL];
//----------------如果hPdu为NULL,而hVbl不为空,则用它来发送,而忽略vblValue、vblOid
//变量绑定列表句柄
HSNMP_VBL hVbl;
//------------------------
//变量数
long nVblCount;
//VBL数组
smiVALUE vblValue[MAX_VBL];
//--------------------------
long nErrorStatus;
long nErrorIndex;
//--------------------------超时或重试信息
DWORD dwRetransmitCont;
DWORD dwTimeOut;
};
class CRecvPduInfo
{
public:
CRecvPduInfo();
~CRecvPduInfo();
public:
//---------------------------得到PDU中的一些句柄,以便回复时使用!
//对方的实体
HSNMP_ENTITY hRcvAgentEntity;
//自己的实体
HSNMP_ENTITY hRcvManagerEntity;
HSNMP_CONTEXT hRcvViewContext;
HSNMP_VBL hRcvVbl;
HSNMP_PDU hRcvPdu;
//---------------------------得到PDU包中的一些固定信息
long nPduType;
long nRequestId;
long nErrorStatus;
long nErrorIndex;
char szCommunity[40];
char szSourceIp[40];
//----------------------------取VBlist中变量信息
long nVblCount;
smiOID vblOid[MAX_VBL];
smiVALUE vblValue[MAX_VBL];
};
class CTrapPduInfo : public CRecvPduInfo
{
public:
CTrapPduInfo();
public:
char szEnterpriseOid[40];
int genericTrap;
int specificTrap;
int nUsefulVbCount;
DWORD dwTimeTicks;
};
//====================================一些函数
SNMPAPI_STATUS convertString2smiValue(smiLPVALUE value, TCHAR *buffer);
SNMPAPI_STATUS SendSnmpMessage(HSNMP_SESSION hSnmpSession, CString strManagerIp,
CString strAgentIp, CString strCommunity,
CString strOidNumber[MAX_VBL], DWORD dwRetransmitCont,
DWORD dwTimeOut, DWORD * pRequestId, int nPduType,
smiVALUE value[MAX_VBL],
int nValueCount = 1, int nErrorStatus = 0,
int nErrorIndex = 0);
SNMPAPI_STATUS SendSnmpMessage(HSNMP_SESSION hSnmpSession, DWORD *pRequestId,
CSendInfo *pSendInfo);
SNMPAPI_STATUS GetSnmpMessage(HSNMP_SESSION hSnmpSession, CRecvPduInfo *pRuiStore);
SNMPAPI_STATUS GetTrapMessage(HSNMP_SESSION hSnmpSession, CTrapPduInfo *pTpiStore);
void GetSnmpErrorDescribe(HSNMP_SESSION hSnmpSession);
void ShowInfoBox(CTrapPduInfo saveTrapInfo);
int GetSelfIp(CString strIp[]);
//------------------------------------------------------//
#endif
//实现文件:
#include "stdafx.h"
#include "SnmpExTools.h"
////////////////////////////////////////////////////////////
// //
// Some Simple Snmp Function //
// Written by LHX , 2001-4-13 //
// //
////////////////////////////////////////////////////////////
CSendInfo::CSendInfo()
{
hAgentEntity = NULL;
hManagerEntity = NULL;
hViewContext = NULL;
hVbl = NULL;
hPdu = NULL;
nPduType = 0;
nErrorStatus = 0;
nErrorIndex = 0;
nVblCount = 0;
}
CSendInfo::~CSendInfo()
{
SnmpFreeEntity(hAgentEntity);
SnmpFreeEntity(hManagerEntity);
SnmpFreeContext(hViewContext);
SnmpFreeVbl(hVbl);
SnmpFreePdu(hPdu);
for(int i = 0; i < nVblCount; i++)
{
SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&vblOid[i]);
switch (vblValue[i].syntax) {
case SNMP_SYNTAX_OCTETS:
SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string);
break;
case SNMP_SYNTAX_OID:
SnmpFreeDescriptor(vblValue[i].syntax, (smiLPOCTETS) &vblValue[i].value.oid);
break;
case SNMP_SYNTAX_IPADDR:
SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string);
break;
}
}
}
CRecvPduInfo::CRecvPduInfo()
{
hRcvAgentEntity = NULL;
hRcvManagerEntity = NULL;
hRcvViewContext = NULL;
hRcvVbl = NULL;
hRcvPdu = NULL;
}
CRecvPduInfo::~CRecvPduInfo()
{
SnmpFreeEntity(hRcvAgentEntity);
SnmpFreeEntity(hRcvManagerEntity);
SnmpFreeContext(hRcvViewContext);
SnmpFreeVbl(hRcvVbl);
SnmpFreePdu(hRcvPdu);
for(int i = 0; i < nVblCount; i++)
{
SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)&vblOid[i]);
switch (vblValue[i].syntax) {
case SNMP_SYNTAX_OCTETS:
SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string);
break;
case SNMP_SYNTAX_OID:
SnmpFreeDescriptor(vblValue[i].syntax, (smiLPOCTETS) &vblValue[i].value.oid);
break;
case SNMP_SYNTAX_IPADDR:
SnmpFreeDescriptor(vblValue[i].syntax, &vblValue[i].value.string);
break;
}
}
}
CTrapPduInfo::CTrapPduInfo()
{
memset(szEnterpriseOid, 0, 40);
genericTrap = 0;
specificTrap = 0;
DWORD dwTimeTicks = 0;
//记录有多少个信息变量!(注意:从第三个开始)
nUsefulVbCount = 0;
}
/*****************************************************/
//---------------------------------
//名称:GetSnmpErrorDescribe
//描述:得到SNMP的错误具体描述
//---------------------------------
void GetSnmpErrorDescribe(HSNMP_SESSION hSnmpSession)
{
CString strErrorInfo;
strErrorInfo = "Snmp错误信息:";
switch(SnmpGetLastError(hSnmpSession))
{
case SNMPAPI_ALLOC_ERROR:
strErrorInfo += "SNMPAPI_ALLOC_ERROR(错误的内存分配)";
break;
case SNMPAPI_CONTEXT_INVALID:
strErrorInfo += "SNMPAPI_CONTEXT_INVALID(无效的上下文参数)";
break;
case SNMPAPI_CONTEXT_UNKNOWN:
strErrorInfo += "SNMPAPI_CONTEXT_UNKNOWN(不知名的上下文参数)";
break;
case SNMPAPI_ENTITY_INVALID:
strErrorInfo += "SNMPAPI_ENTITY_INVALID(无效的实体)";
break;
case SNMPAPI_ENTITY_UNKNOWN:
strErrorInfo += "SNMPAPI_ENTITY_UNKNOWN(不知名的实体)";
break;
case SNMPAPI_INDEX_INVALID:
strErrorInfo += "SNMPAPI_INDEX_INVALID(无效的VBL索引参数)";
break;
case SNMPAPI_NOOP:
strErrorInfo += "SNMPAPI_NOOP(没有操作被完成)";
break;
case SNMPAPI_OID_INVALID:
strErrorInfo += "SNMPAPI_OID_INVALID(无效的OID参数)";
break;
case SNMPAPI_OPERATION_INVALID:
strErrorInfo += "SNMPAPI_OPERATION_INVALID(无效的或不支持的操作)";
break;
case SNMPAPI_OUTPUT_TRUNCATED:
strErrorInfo += "SNMPAPI_OUTPUT_TRUNCATED(输出缓存长度不够)";
break;
case SNMPAPI_PDU_INVALID:
strErrorInfo += "SNMPAPI_PDU_INVALID(无效的PDU参数)";
break;
case SNMPAPI_SESSION_INVALID:
strErrorInfo += "SNMPAPI_SESSION_INVALID(无效的Session参数)";
break;
case SNMPAPI_SYNTAX_INVALID:
strErrorInfo += "SNMPAPI_SYNTAX_INVALID(smiVALUE中的syntax无效)";
break;
case SNMPAPI_VBL_INVALID:
strErrorInfo += "SNMPAPI_VBL_INVALID(无效的VBL参数)";
break;
case SNMPAPI_MODE_INVALID:
strErrorInfo += "SNMPAPI_MODE_INVALID(无效的模式参数)";
break;
case SNMPAPI_SIZE_INVALID:
strErrorInfo += "SNMPAPI_SIZE_INVALID(无效的长度参数)";
break;
case SNMPAPI_NOT_INITIALIZED:
strErrorInfo += "SNMPAPI_NOT_INITIALIZED(SnmpStartup函数没有调用或调用失败)";
break;
case SNMPAPI_MESSAGE_INVALID:
strErrorInfo += "SNMPAPI_MESSAGE_INVALID(无效的SNMP消息格式)";
break;
case SNMPAPI_HWND_INVALID:
strErrorInfo += "SNMPAPI_HWND_INVALID(无效的窗口句柄)";
break;
case SNMPAPI_OTHER_ERROR:
strErrorInfo += "SNMPAPI_OTHER_ERROR(不明确的错误)";
break;
//------------------------------------
case SNMPAPI_TL_NOT_INITIALIZED:
strErrorInfo += "SNMPAPI_TL_NOT_INITIALIZED(网络传输层没有被初始化)";
break;
case SNMPAPI_TL_NOT_SUPPORTED:
strErrorInfo += "SNMPAPI_TL_NOT_SUPPORTED(网络传输层不支持的协议)";
break;
case SNMPAPI_TL_NOT_AVAILABLE:
strErrorInfo += "SNMPAPI_TL_NOT_AVAILABLE(网络子系统错误)";
break;
case SNMPAPI_TL_RESOURCE_ERROR:
strErrorInfo += "SNMPAPI_TL_RESOURCE_ERROR(网络传输层资源错误)";
break;
case SNMPAPI_TL_UNDELIVERABLE:
strErrorInfo += "SNMPAPI_TL_UNDELIVERABLE(目标地址不能到达)";
break;
case SNMPAPI_TL_SRC_INVALID:
strErrorInfo += "SNMPAPI_TL_SRC_INVALID(来源的末端无效)";
break;
case SNMPAPI_TL_INVALID_PARAM:
strErrorInfo += "SNMPAPI_TL_INVALID_PARAM(输入的参数无效)";
break;
case SNMPAPI_TL_IN_USE:
strErrorInfo += "SNMPAPI_TL_IN_USE(来源的末端正被使用)";
break;
case SNMPAPI_TL_TIMEOUT:
strErrorInfo += "SNMPAPI_TL_TIMEOUT(在超时之前没有得到响应)";
break;
case SNMPAPI_TL_PDU_TOO_BIG:
strErrorInfo += "SNMPAPI_TL_PDU_TOO_BIG(对于Send或Receive来说PDU太大了)";
break;
case SNMPAPI_TL_OTHER:
strErrorInfo += "SNMPAPI_TL_OTHER(不明确的网络传输层错误)";
break;
default:
strErrorInfo += "不知名错误!";
break;
}
lMsg(strErrorInfo);
}
//----------------------------------
//名称:GetSnmpMessage
//描述:解Snmp包
//----------------------------------
SNMPAPI_STATUS GetSnmpMessage(HSNMP_SESSION hSnmpSession, CRecvPduInfo * pRuiStore)
{
SNMPAPI_STATUS s;
smiOCTETS oct;
ZeroMemory(pRuiStore, sizeof(CRecvPduInfo));
s = SnmpRecvMsg(hSnmpSession, &pRuiStore->hRcvAgentEntity, &pRuiStore->hRcvManagerEntity,
&pRuiStore->hRcvViewContext, &pRuiStore->hRcvPdu);
if(s == SNMPAPI_FAILURE)
{
lMsg("SnmpRecvMsg时出错!");
GetSnmpErrorDescribe(hSnmpSession);
return SNMPAPI_FAILURE;
}
//得到发送消息代理的IP
SnmpEntityToStr(pRuiStore->hRcvAgentEntity, 40, pRuiStore->szSourceIp);
//得到共用体名称
::SnmpContextToStr(pRuiStore->hRcvViewContext, &oct);
strcpy(pRuiStore->szCommunity, (const char *)oct.ptr);
pRuiStore->szCommunity[oct.len] = 0;
//----------------------------------------------------------------//得到PDU
s = SnmpGetPduData(pRuiStore->hRcvPdu, &pRuiStore->nPduType, &pRuiStore->nRequestId,
&pRuiStore->nErrorStatus, &pRuiStore->nErrorIndex, &pRuiStore->hRcvVbl);
if(s == SNMPAPI_FAILURE)
{
lMsg("SnmpGetPduData时出错!!");
GetSnmpErrorDescribe(hSnmpSession);
return SNMPAPI_FAILURE;
}
//得到此PDU中包含的VBlist数量
pRuiStore->nVblCount = SnmpCountVbl(pRuiStore->hRcvVbl);
//得到每个VBlist的变量信息
for (int i = 1; i <= pRuiStore->nVblCount; i++)
{
//!!!!!!!!!!注意!!!!!!!!!!!!!!!//
//SnmpGetVb中的index是从1开始!
s = SnmpGetVb(pRuiStore->hRcvVbl, i, &pRuiStore->vblOid[i - 1],
&pRuiStore->vblValue[i - 1]);
if(s == SNMPAPI_FAILURE)
{
lMsg("SnmpGetVb时出错!!");
GetSnmpErrorDescribe(hSnmpSession);
return SNMPAPI_FAILURE;
}
}
//!!!注意:释放资源!!!!
SnmpFreeDescriptor(SNMP_SYNTAX_OCTETS, &oct);
return SNMPAPI_SUCCESS;
}
//----------------------------------
//名称:SendSnmpMessage
//描述:简单的发送Snmp包(一)
//----------------------------------
SNMPAPI_STATUS SendSnmpMessage(HSNMP_SESSION hSnmpSession, DWORD *pRequestId,
CSendInfo *pSendInfo)
{
SNMPAPI_STATUS status;
if(!pSendInfo->hAgentEntity || !pSendInfo->hManagerEntity
|| !pSendInfo->hViewContext)
{
lMsg("参数不全!");
return SNMPAPI_FAILURE;
}
//--------------------------------------------------------------------------------
//设置管理者重试次数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -