/*---------------------------------------
SNMP信息刺探程序
----------------------------------------*/
#include <stdio.h>
#include <malloc.h>
#include <snmp.h>
#include <mgmtapi.h>
#pragma comment(lib,"Mgmtapi.lib")
#pragma comment(lib,"Snmpapi.lib")
//利用 SNMP API时需要以上头文件和库文件
#define GET 1 //get,就理解成获取一个信息。
#define GETNEXT 2 //getnext,就理解成获取下一个信息。
#define WALK 3 //walk,就理解成获取一堆信息,即所有数据库子树/子目录的信息
#define TIMEOUT 6000 /* milliseconds */
#define RETRIES 3
//一些有用的oid
char *SnmpOid[5]={".1.3.6.1.2.1.25.4.2.1.2",//进程列表
".1.3.6.1.4.1.77.1.2.25.1.1",//系统用户
".1.3.6.1.4.1.77.1.4.1.0",//域名
".1.3.6.1.2.1.25.6.3.1.2",//列出安装的软件
".1.3.6.1.2.1.1"};// 列出系统信息
void usage(char *name)
{
printf("=================SNMP tool================/n");
printf("=======gxisone@hotmail.com 2004/8/10====/n");
printf("/nusage: %s [remoteip] [sysprocess|sysuser|domainname|sysinf|software]/n",name);
printf("Exameple: %s 192.168.1.1 sysuser/n",name);
}
int main(int argc,char *argv[])
{
int operation;
LPSTR agent;
LPSTR community;
RFC1157VarBindList variableBindings;
LPSNMP_MGR_SESSION session;
int timeout = TIMEOUT;
int retries = RETRIES;
int i;
BYTE requestType;
AsnInteger errorStatus;
AsnInteger errorIndex;
char *chkPtr = NULL;
operation = WALK; //这个程序使用WALK来获取信息
if (argc != 3)
{
usage(argv[0]);
return 0;
}
else
{
AsnObjectIdentifier reqObject;
// 取得IP地址
agent = (LPSTR)SNMP_malloc(strlen(*argv) + 1);
strcpy(agent, argv[1]);
community="public";//设置查询密码
variableBindings.list = NULL;
variableBindings.len = 0;
// 设置 oid
if(!strcmp(argv[2],"sysprocess"))i=0;
else if(!strcmp(argv[2],"sysuser"))i=1;
else if(!strcmp(argv[2],"domainname"))i=2;
else if(!strcmp(argv[2],"software"))i=3;
else if(!strcmp(argv[2],"sysinf"))i=4;
else{
usage(argv[0]);
return 0;
}
printf("%s/n",SnmpOid[i]);
// 把字符串转换成标准oid
if (!SnmpMgrStrToOid(SnmpOid[i], &reqObject))
{
printf("Error: Invalid oid, %s, specified./n", *argv);
return 1;
}
else
{
variableBindings.len++;
if ((variableBindings.list = (RFC1157VarBind *)SNMP_realloc(
variableBindings.list, sizeof(RFC1157VarBind) *
variableBindings.len)) == NULL)
{
printf("Error: Error allocating oid, %s./n",*argv);
return 1;
}
variableBindings.list[variableBindings.len - 1].name=reqObject;
variableBindings.list[variableBindings.len - 1].value.asnType=ASN_NULL;
}
// Make sure only one variable binding was specified if operation
// is WALK.
if (operation == WALK && variableBindings.len != 1)
{
printf("Error: Multiple oids specified for WALK./n");
return 1;
}
// Establish a SNMP session to communicate with the remote agent. The
// community, communications timeout, and communications retry count
// for the session are also required.
if ((session = SnmpMgrOpen(agent, community, timeout, retries)) == NULL)
{
printf("error on SnmpMgrOpen %d/n", GetLastError());
return 1;
}
} // end if
{
AsnObjectIdentifier root;
AsnObjectIdentifier tempOid;
SnmpUtilOidCpy(&root, &variableBindings.list[0].name);
requestType = ASN_RFC1157_GETNEXTREQUEST;
for(;;)
{
if (!SnmpMgrRequest(session, requestType, &variableBindings,
&errorStatus, &errorIndex))
{
printf("error on SnmpMgrRequest %d/n", GetLastError());
break;
}
else
{
if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME ||
SnmpUtilOidNCmp(&variableBindings.list[0].name,
&root, root.idLength))
{
printf("End of MIB subtree./n/n");
break;
}
if (errorStatus > 0)
{
printf("Error: errorStatus=%d, errorIndex=%d /n", errorStatus, errorIndex);
break;
}
else
{
// 打印查询的结果
char *string = NULL;
SnmpMgrOidToStr(&variableBindings.list[0].name, &string);
printf("Variable = %s/n", string);
if (string) SNMP_free(string);
printf("Value = ");
SnmpUtilPrintAsnAny(&variableBindings.list[0].value);
printf("/n");
}
} // end if()
// 准备下一次查询
SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name);
SnmpUtilVarBindFree(&variableBindings.list[0]);
SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid);
variableBindings.list[0].value.asnType = ASN_NULL;
SnmpUtilOidFree(&tempOid);
} // end while()
// 释放资源
SnmpUtilVarBindListFree(&variableBindings);
SnmpUtilOidFree(&root);
}
// 关闭 SNMP session
if (!SnmpMgrClose(session))//清理退出
{
printf("error on SnmpMgrClose %d/n", GetLastError());
return 1;
}
return 0;
}
分享到:
相关推荐
SNMP编程,VC++实现SNMP++静态链接库的生成,有详细的图文过程。一看就会!
vc++的SNMP软件开发,网络端口信息,设备运行状态,系统信息
VC++实现的基于SNMP网络管理技术,全书及部分代码
最新的snmp++资料,用于生成lib文件
本MIB浏览器用VC++语言实现的源码,采用SNMP++包开发的,是基于SNMP协议,对基于SNMP协议的网络管理开发可提供很好的参考价值。
SNMP++ 在vc下实现
简单SNMP管理程序的VC++代码实例实现
这是一个snmp管理程序,基于snmp v1与snmp代理程序通信获取信息,本人一直想找个基于socket自已组包进行snmp管理的程序没有找到,又不想基于com接口或者windows api接口进行编程,本程序在vc6.0下编译通过。
理解SNMP、SNMP++及用VC++6.0实现Windows SNMP编程.pdf
利用SNMP++软件包实现了利用SNMP协议,通过访问MIB找到网络流量,内有说明文档,安照文档配置,可在vc6.0下编译通过!
用VB6实现SNMP通信,程序中详细对SNMP数据结构进行了解析
snmp文档。基于vc++~很给力!多多关照
LINUX环境下用C++实现SNMP网管协议(作者:耶健)
然后设计并实现了一个网络管理系统基于SNMP用VC++和SNMP++ API。该系统由设备性能管理模块,网络故障管理模块,和网络拓扑检测模块。它直观地显示网络设备的运行状态,并通知网络管理系统管理员的故障,使网络管理员...
Java使用SNMP4J实现snmp trap接口发送消息_20170808_LK
利用C++实现SNMP协议,包括最常用的GET,GETNEXT操作等。
基于VS下的C++ SNMP实例程序,带SNMP库源码,LIB及其编译方法文档,DEMO均测试通过(包括获取OID和TRAP服务)。
snmp4j 实现snmp trap发送与接收
利用snmp4j实现snmp协议三个版本的get、getnext、set、trap操作的源代码,帮助你快速上手snmp协议的实现