📄 snmp探测代码.txt
字号:
/**************************************************************/
// 工具函数
//
/**************************************************************/
int GetSelfIp(CString strIp[])
{
int nCount = 0;
WORD wversionrequested;
WSADATA wsadata;
char name[255];
wversionrequested = MAKEWORD( 2, 0 );
//调用WinSock2功能之前必须调用WSAStartup
if ( WSAStartup( wversionrequested, &wsadata ) == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
PHOSTENT hostinfo;
hostinfo = gethostbyname(name);
for(int i = 0; hostinfo!= NULL && hostinfo->h_addr_list[i] != NULL; i++ )
{
strIp[i] = inet_ntoa (*(struct in_addr *)hostinfo->h_addr_list[i]);
nCount++;
}
}
WSACleanup( );
}
return nCount;
}
SNMPAPI_STATUS convertString2smiValue(smiLPVALUE value, TCHAR *buffer)
{
SNMPAPI_STATUS rv = SNMPAPI_SUCCESS;
TCHAR *ts;
int i, n;
smiOID tOid;
smiUINT32 tOidVal[MAXOBJIDSTRSIZE];
smiVALUE tValue;
smiBYTE tValueVal[500];
DWORD dwi;
switch (value->syntax) {
case SNMP_SYNTAX_INT:
// case SNMP_SYNTAX_INT32:
value->value.sNumber = _ttol(buffer);
break;
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
value->value.uNumber = _tcstoul(buffer, NULL, 10);
break;
case SNMP_SYNTAX_TIMETICKS:
value->value.uNumber = _tcstoul(buffer, NULL, 10);
break;
case SNMP_SYNTAX_CNTR64:
// To do!
_stscanf(buffer, _TEXT("%08x.%08x"),
value->value.hNumber.hipart,
value->value.hNumber.lopart);
break;
case SNMP_SYNTAX_OCTETS:
#if defined(__BORLANDC__)
value->value.string.len = _tcslen(buffer);
#else
value->value.string.len = _tcsclen(buffer);
#endif
value->value.string.ptr = (smiBYTE *) malloc(value->value.string.len * sizeof(smiBYTE));
ts = buffer;
for (dwi = 0; dwi < value->value.string.len; dwi++) {
*(value->value.string.ptr + dwi) = (BYTE) *ts++;
}
break;
case SNMP_SYNTAX_BITS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_IPADDR:
tValue.syntax = value->syntax;
tValue.value.string.len = 0;
tValue.value.string.ptr = tValueVal;
ts = buffer;
for (n = 0; n < 4; n++) {
if (_stscanf(ts, _TEXT("%d"), &i) == 0) {
rv = SNMPAPI_FAILURE;
break;
}
tValue.value.string.len++;
tValue.value.string.ptr[n] = (BYTE) i;
while ((*ts != TCHAR('.')) && (*ts != TCHAR('\0')))
ts++;
if (*ts == TCHAR('\0')) break;
ts++; // One more for the first digit
if (*ts == TCHAR('\0')) break;
}
if (n != 3) {
rv = SNMPAPI_FAILURE;
break;
}
// Allocate memory for value.oid value and copy oid
// leave syntax unchanged
value->value.string.ptr = (smiBYTE *) malloc(tValue.value.string.len * sizeof(smiBYTE));
if (value->value.string.ptr) {
value->value.string.len = tValue.value.string.len;
memcpy(value->value.string.ptr, tValue.value.string.ptr, tValue.value.string.len * sizeof(smiBYTE));
}
else {
rv = SNMPAPI_FAILURE;
}
break;
case SNMP_SYNTAX_NSAPADDR:
break;
case SNMP_SYNTAX_OID:
// Use SnmpStrToOid ...
tOid.len = 0;
tOid.ptr = &tOidVal[0];
value->value.oid.len = 0;
n = 0;
ts = buffer;
while (1) {
if (_stscanf(ts, _TEXT("%d"), &i) == 0) {
rv = SNMPAPI_FAILURE;
break;
}
tOid.len++;
tOid.ptr[n++] = i;
while ((*ts != TCHAR('.')) && (*ts != TCHAR('\0')))
ts++;
if (*ts == TCHAR('\0')) break;
ts++; // One more for the first digit
if (*ts == TCHAR('\0')) break;
}
if (rv != TRUE)
break;
// Allocate memory for value.oid value and copy oid
value->value.oid.ptr = (smiUINT32 *) malloc(tOid.len * sizeof(smiUINT32));
if (value->value.oid.ptr) {
value->value.oid.len = tOid.len;
memcpy(value->value.oid.ptr, tOid.ptr, tOid.len * sizeof(smiUINT32));
}
else {
rv = SNMPAPI_FAILURE;
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
value->value.empty = 0;
break;
default:
rv = SNMPAPI_FAILURE;
break;
}
//-----------------释放资源
//--------------------
return rv;
}
//-------------------------------
//名称:ShowInfoBox
//描述:显示TRAP包中信息的对话框
//-------------------------------
void ShowInfoBox(CTrapPduInfo saveTrapInfo)
{
CString str, strTrapVer, strAgentIp;
CString strError;
char szOid[MAXOBJIDSTRSIZE];
char szBindOid[MAXOBJIDSTRSIZE];
//-------------------------------------
strAgentIp = "代理IP地址为:";
strAgentIp += saveTrapInfo.szSourceIp;
strAgentIp += "\n";
//-----------------------------------------
switch(saveTrapInfo.nPduType)
{
case SNMP_PDU_V1TRAP :
strTrapVer = "接收到的Trap包格式为:V1格式的TRAP包\n\n";
break;
case SNMP_PDU_TRAP:
strTrapVer = "接收到的Trap包格式为:V2格式的TRAP包\n\n";
break;
}
int nCount = 0;
int nOidNumber = 0;
CString strSubInfo[MAX_VBL];
nCount = saveTrapInfo.nVblCount;
CString strOid, strAllOid = "", strTimeTick, strEnterpriseOid;
memset(szOid, 0, MAXOBJIDSTRSIZE);
for (int i = 1; i <= saveTrapInfo.nVblCount; i++)
{
memset(szBindOid, 0, MAXOBJIDSTRSIZE);
::SnmpOidToStr(&saveTrapInfo.vblOid[i - 1], MAXOBJIDSTRSIZE, szBindOid);
//---------------------------------------------------------------
switch(saveTrapInfo.vblValue[i - 1].syntax)
{
case SNMP_SYNTAX_INT:
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了数字(INT)信息:%d\n",
i, szBindOid,
saveTrapInfo.vblValue[i - 1].value.sNumber);
break;
//------------------------------------------
case SNMP_SYNTAX_BITS :
memset(szOid, 0, MAXOBJIDSTRSIZE);
memcpy(szOid, saveTrapInfo.vblValue[i - 1].value.string.ptr,
saveTrapInfo.vblValue[i - 1].value.string.len);
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含的比特串(BITS)信息:%s\n",
i, szBindOid, szOid);
break;
case SNMP_SYNTAX_OCTETS ://
memset(szOid, 0, MAXOBJIDSTRSIZE);
memcpy(szOid, saveTrapInfo.vblValue[i - 1].value.string.ptr,
saveTrapInfo.vblValue[i - 1].value.string.len);
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含的字符串(OCTETS)信息:%s\n",
i, szBindOid, szOid);
break;
case SNMP_SYNTAX_OID :
memset(szOid, 0, MAXOBJIDSTRSIZE);
::SnmpOidToStr(&saveTrapInfo.vblValue[i - 1].value.oid, MAXOBJIDSTRSIZE, szOid);
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含的OID信息为:%s\n",
i, szBindOid, szOid);
if(i == 2)
{
if(saveTrapInfo.genericTrap == 6)
{
strError.Format("一般陷阱代码为:%d\n特殊陷阱代码为:%d\n",
saveTrapInfo.genericTrap, saveTrapInfo.specificTrap);
}
else
{
strError.Format("一般陷阱代码为:%d\n",
saveTrapInfo.genericTrap);
}
}
if(i == nCount)
{
strEnterpriseOid.Format("产生陷阱的网络设备的对象标识为:%s\n", szOid);
}
break;
case SNMP_SYNTAX_IPADDR :
memset(szOid, 0, MAXOBJIDSTRSIZE);
memcpy(szOid, saveTrapInfo.vblValue[i - 1].value.string.ptr,
saveTrapInfo.vblValue[i - 1].value.string.len);
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含的IP地址信息为:%s\n",
i, szBindOid, szOid);
break;
//---------------------------------------------
case SNMP_SYNTAX_CNTR32 :
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了CNTR32的记数变量:%d\n",
i, szBindOid, saveTrapInfo.vblValue[i - 1].value.uNumber);
break;
case SNMP_SYNTAX_TIMETICKS :
strTimeTick.Format("时间戳信息为:%d(秒)\n****************************************\n",
saveTrapInfo.dwTimeTicks/100);
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了时间戳信息为:%d(秒)\n",
i, szBindOid, saveTrapInfo.dwTimeTicks/100);
break;
case SNMP_SYNTAX_OPAQUE :
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了OPAQUE信息:%u\n",
i, szBindOid, saveTrapInfo.vblValue[i - 1].value.uNumber);
break;
case SNMP_SYNTAX_UINT32 :
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了UINT32信息:%u\n",
i, szBindOid, saveTrapInfo.vblValue[i - 1].value.uNumber);
break;
//---------------------------------------
case SNMP_SYNTAX_CNTR64 :
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了CNTR64信息:%x.%x\n",
i, szBindOid, saveTrapInfo.vblValue[i - 1].value.hNumber.hipart,
saveTrapInfo.vblValue[i - 1].value.hNumber.lopart);
break;
//-------------------------------------
case SNMP_SYNTAX_GAUGE32 :
strSubInfo[nOidNumber++].Format("第 %d 个VBlist(OID:%s)中包含了GAUGE32信息:%u\n",
i, szBindOid, saveTrapInfo.vblValue[i - 1].value.uNumber);
break;
case SNMP_SYNTAX_NULL :
AfxMessageBox("SNMP_SYNTAX_NULL");
break;
case SNMP_SYNTAX_NOSUCHOBJECT :
AfxMessageBox("SNMP_SYNTAX_NOSUCHOBJECT");
break;
case SNMP_SYNTAX_NOSUCHINSTANCE :
AfxMessageBox("SNMP_SYNTAX_NOSUCHINSTANCE");
break;
case SNMP_SYNTAX_ENDOFMIBVIEW :
AfxMessageBox("SNMP_SYNTAX_ENDOFMIBVIEW");
break;
//------------------------------------
default:
AfxMessageBox("没有可用信息");
break;
}
}
//--------------------------------
strOid.Format("共用体名称为:%s\n", saveTrapInfo.szCommunity);
str += strTrapVer + strEnterpriseOid + strAgentIp + strError + strTimeTick;
for(i = 0; i < nOidNumber; i++)
{
str += strSubInfo[i];
}
str += strAllOid + strOid;
AfxMessageBox(str);
}
/*
//具体的错误状态
switch(errorStatus)
{
case SNMP_ERROR_NOERROR:
AfxMessageBox("SNMP_ERROR_NOERROR");
break;
case SNMP_ERROR_TOOBIG :
AfxMessageBox("SNMP_ERROR_TOOBIG");
break;
case SNMP_ERROR_NOSUCHNAME:
AfxMessageBox("SNMP_ERROR_NOSUCHNAME");
break;
case SNMP_ERROR_BADVALUE :
AfxMessageBox("SNMP_ERROR_BADVALUE");
break;
case SNMP_ERROR_READONLY :
AfxMessageBox("SNMP_ERROR_READONLY");
break;
case SNMP_ERROR_GENERR :
AfxMessageBox("SNMP_ERROR_GENERR");
break;
case SNMP_ERROR_NOACCESS :
AfxMessageBox("SNMP_ERROR_NOACCESS");
break;
case SNMP_ERROR_WRONGTYPE :
AfxMessageBox("SNMP_ERROR_WRONGTYPE");
break;
case SNMP_ERROR_WRONGLENGTH :
AfxMessageBox("SNMP_ERROR_WRONGLENGTH");
break;
case SNMP_ERROR_WRONGENCODING :
AfxMessageBox("SNMP_ERROR_WRONGENCODING");
break;
case SNMP_ERROR_NOCREATION :
AfxMessageBox("SNMP_ERROR_NOCREATION");
break;
case SNMP_ERROR_INCONSISTENTVALUE:
AfxMessageBox("SNMP_ERROR_INCONSISTENTVALUE");
break;
case SNMP_ERROR_RESOURCEUNAVAILABLE :
AfxMessageBox("SNMP_ERROR_RESOURCEUNAVAILABLE");
break;
case SNMP_ERROR_COMMITFAILED :
AfxMessageBox("SNMP_ERROR_COMMITFAILED");
break;
case SNMP_ERROR_UNDOFAILED :
AfxMessageBox("SNMP_ERROR_UNDOFAILED");
break;
case SNMP_ERROR_AUTHORIZATIONERROR :
AfxMessageBox("SNMP_ERROR_AUTHORIZATIONERROR");
break;
case SNMP_ERROR_NOTWRITABLE :
AfxMessageBox("SNMP_ERROR_NOTWRITABLE");
break;
case SNMP_ERROR_INCONSISTENTNAME :
AfxMessageBox("SNMP_ERROR_INCONSISTENTNAME");
break;
default:
AfxMessageBox("成功");
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -