当前位置:网站首页>利用net-snmp的库实现snmpget,snmpset
利用net-snmp的库实现snmpget,snmpset
2022-08-03 19:15:00 【cao849861802】
需要的net-snmp的库如下:
-rwxrwxrwx 1 root root 2971144 12月 3 09:04 libnetsnmp.so
-rwxrwxrwx 1 root root 2971144 12月 3 09:04 libnetsnmp.so.40
-rwxrwxrwx 1 root root 2971144 12月 3 09:04 libnetsnmp.so.40.1.0
代码如下:
代码中模仿了两个snmp客户端来操作,然后例子中只用了客户端0,可以打开两个和多个,另外如果服务器不存在的话,snmp连接的超时时间是6s,所以代码会一直卡住,所以需要多个的时候要开多个线程,readNum就是不同的客户端的index,
注意修改代码中的共同体名和ip地址,还有代码中的oid;
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "pthread.h"
#include <unistd.h>
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#define SNMP_LOGIN_CLI_MAX 2
static struct snmp_session *sessHandle[SNMP_LOGIN_CLI_MAX];
static struct snmp_pdu *response[SNMP_LOGIN_CLI_MAX];
/***********************************************************************
* 函数名 :adminSnmpSessionInit
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值 : 无
*/
static int adminSnmpSessionInit(unsigned int readNum,char *community,char *ipAddr)
{
struct snmp_session session;
static pthread_mutex_t adminSnmpLock = PTHREAD_MUTEX_INITIALIZER;
char buf[64];
if(readNum >= SNMP_LOGIN_CLI_MAX || community == NULL || ipAddr == NULL)
{
return ERROR;
}
if(sessHandle[readNum] == NULL)
{
memset(&session,0,sizeof(struct snmp_session));
memset(buf,0,sizeof(buf));
sprintf(buf,"admin %d snmp",readNum);
pthread_mutex_lock(&adminSnmpLock);
init_snmp(buf);
snmp_sess_init(&session);
pthread_mutex_unlock(&adminSnmpLock);
session.version = SNMP_VERSION_2c;
session.community = community;
session.community_len = strlen(session.community);
session.peername = ipAddr;
sessHandle[readNum] = snmp_open(&session);
if(sessHandle[readNum] == NULL)
{
return ERROR;
}
}
return OK;
}
/***********************************************************************
* 函数名 :adminSnmpSessionClose
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值 : 无
*/
static void adminSnmpSessionClose(unsigned int readNum)
{
if(readNum >= SNMP_LOGIN_CLI_MAX)
{
return ;
}
if(sessHandle[readNum])
{
snmp_close(sessHandle[readNum]);
sessHandle[readNum] = NULL;
}
}
/***********************************************************************
* 函数名 :adminSnmpResponsePduFree
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值 : 无
*/
static void adminSnmpResponsePduFree(unsigned int readNum)
{
if(readNum >= SNMP_LOGIN_CLI_MAX)
{
return;
}
if(response[readNum])
{
snmp_free_pdu(response[readNum]);
response[readNum] = NULL;
}
}
/***********************************************************************
* 函数名 :adminSnmpGetOid
* 功能描述 :
* 输入参数 : netsnmp_vardata
typedef union{
long *integer;
u_char *string;
oid *objid;
u_char *bitstring;
struct counter64 *counter64;
}netsnmp_vardata;
* 输出参数 : 无
* 返回值 : 无
*/
static int adminSnmpGetOid(unsigned int readNum,char *cpOid,netsnmp_vardata *snmpGetData)
{
oid idOid[MAX_OID_LEN];
size_t id_len = MAX_OID_LEN;
netsnmp_variable_list *vars = NULL;
struct snmp_pdu *pdu = NULL;
char ipBuf[64];
char commBuf[64];
int status;
if(readNum >= SNMP_LOGIN_CLI_MAX || cpOid == NULL)
{
return STAT_ERROR;
}
//此处修改共同体,和ip
if(ERROR == adminSnmpSessionInit(readNum,"public","127.0.0.1"))
{
return STAT_ERROR;
}
pdu = snmp_pdu_create(SNMP_MSG_GET);
if(NULL == pdu)
{
adminSnmpSessionClose(readNum);
return STAT_ERROR;
}
memset(idOid,0,sizeof(idOid));
read_objid(cpOid,idOid,&id_len);
snmp_add_null_var(pdu,idOid,id_len);
status = snmp_synch_response(sessHandle[readNum], pdu, &response[readNum]);
if(status != STAT_SUCCESS)
{
adminSnmpResponsePduFree(readNum);
adminSnmpSessionClose(readNum);
return STAT_TIMEOUT;
}
if(response[readNum] && response[readNum]->errstat == SNMP_ERR_NOERROR)
{
for (vars = response[readNum]->variables; vars; vars = vars->next_variable)
{
if((vars->type != SNMP_NOSUCHOBJECT)
&& (vars->type != SNMP_NOSUCHINSTANCE)
&& (vars->type != SNMP_ENDOFMIBVIEW))
{
*snmpGetData = vars->val;
return STAT_SUCCESS;
}
}
}
return STAT_ERROR;
}
/***********************************************************************
* 函数名 :adminSnmpSetOid
* 功能描述 :
* 输入参数 : type:i,u,3,c,C,t,s,b,a,o
* 输出参数 : 无
* 返回值 : 无
*/
static int adminSnmpSetOid(unsigned int readNum,char *cpOid,char type,char *value)
{
oid idOid[MAX_OID_LEN];
size_t id_len = MAX_OID_LEN;
struct snmp_pdu *pdu = NULL;
char ipBuf[64];
char commBuf[64];
int status;
if(readNum >= SNMP_LOGIN_CLI_MAX || cpOid == NULL)
{
return STAT_ERROR;
}
//此处修改共同体,和ip
if(ERROR == adminSnmpSessionInit(readNum,"public","127.0.0.1"))
{
return STAT_ERROR;
}
pdu = snmp_pdu_create(SNMP_MSG_SET);
if(NULL == pdu)
{
adminSnmpSessionClose(readNum);
return STAT_ERROR;
}
memset(idOid,0,sizeof(idOid));
read_objid(cpOid,idOid,&id_len);
snmp_add_var(pdu,idOid,id_len,type,value);
status = snmp_synch_response(sessHandle[readNum], pdu, &response[readNum]);
if(status != STAT_SUCCESS)
{
adminSnmpResponsePduFree(readNum);
adminSnmpSessionClose(readNum);
return STAT_TIMEOUT;
}
if(response[readNum] && response[readNum]->errstat == SNMP_ERR_NOERROR)
{
return (response[readNum]->errindex == 0) ? STAT_SUCCESS : STAT_ERROR;
}
return STAT_ERROR;
}
/***********************************************************************
* 函数名 :adminSnmpGetMsg
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值 : 无
*/
void adminSnmpGetMsg(unsigned int readNum,char *oid)
{
int i = 0;
char buf[256];
char key[64];
char value[64];
netsnmp_vardata snmpGetData;
if(oid == NULL || option == NULL)
{
return ;
}
for(i = 0; i < SNMP_SWITCH_PORT_NUM; i++)
{
memset(buf,0,sizeof(buf));
memset(&snmpGetData,0,sizeof(netsnmp_vardata));
if(STAT_SUCCESS == adminSnmpGetOid(readNum,oid,&snmpGetData))
{
memset(value,0,sizeof(value));
sprintf(value,"%ld",*snmpGetData.integer);
printf("value = %s\n",value);
}
adminSnmpResponsePduFree(readNum);//处理完数据之后要释放pdu
}
}
/***********************************************************************
* 函数名 :adminSnmpATask
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值 : 无
*/
void *adminSnmpATask(void *argv)
{
//修改这个地方的oid
adminSnmpGetMsg(0,"1.3.6.1.4.1");
}
边栏推荐
猜你喜欢
Radondb mysql installation problems
梅科尔工作室-14天华为培训六
京东云发布新一代分布式数据库StarDB 5.0
LeetCode 622. Designing Circular Queues
【夜莺监控方案】08-监控msyql集群(prometheuse+n9e+mysqld_exporter)
梅科尔工作室-14天华为培训七
Solution for no navigation bar after Word is saved as PDF
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
LineSegmentTree线段树
「游戏建模干货」建模大师几步操作,学习经典,赶紧脑补一下吧
随机推荐
Radondb mysql installation problems
如何理解即时通讯开发移动网络的“弱”和“慢”
Difference差分数组
Confused!Ali was abused on the one hand, but was fortunate to be promoted to Huawei's technology, and successfully got the offer, with an annual salary of 40w
机器学习的方法总结
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
flex布局
系统太多,多账号互通如何实现?
X86函数调用模型分析
关于2022年度深圳市技术攻关重大项目的申报通知
Power button brush the topic of merging two orderly array
The effective square of the test (one question of the day 7/29)
Postgresql源码(65)新快照体系Globalvis工作原理分析
【Azure 事件中心】使用Azure AD认证方式创建Event Hub Consume Client + 自定义Event Position
Zhong Hua, senior architect of Ali: China-Taiwan strategic thinking and architecture practice; including internal implementation manual
BinomialTree 二叉树
APT级全面免杀与企业纵深防御体系的红蓝对抗
BinaryIndexedTrees树状数组
Postgresql快照优化Globalvis新体系分析(性能大幅增强)
力扣刷题之分数加减运算(每日一题7/27)