当前位置:网站首页>利用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");
}
边栏推荐
- 梅科尔工作室-14天华为培训六
- 阿里巴巴政委体系-第五章、阿里政委体系建设
- Handler source code analysis
- CS kill-free pose
- 金鱼哥RHCA回忆录:CL210管理计算资源--管理计算节点+章节实验
- 懵逼!阿里一面被虐了,幸获内推华为技术四面,成功拿到offer,年薪40w
- Postgresql source code (64) Query execution - data structure and execution process before submodule Executor (2) execution
- epoll + 线程池 + 前后置服务器分离
- 软件测试回归案例,什么是回归测试?
- C#将位图旋转90度
猜你喜欢
Alibaba senior experts create a learning architecture from scratch, including Alibaba's internal technology stack PPT, PFD actual combat
京东云发布新一代分布式数据库StarDB 5.0
The ecological environmental protection management system based on mobile GIS
Kettle 读取 Excel 数据输出到 Oracle 详解
2022年最新的Android面试大厂必考174题(附带详细答案)
图像超分——Real-ESRGAN快速上手
Matlab论文插图绘制模板第42期—气泡矩阵图(相关系数矩阵图)
阿里巴巴政委体系-第八章、阿里政委工作方法论
梅科尔工作室-14天华为培训七
go语言实现导出string字符串到文件中
随机推荐
分享即时通讯开发之WebSocket:概念、原理、易错常识、动手实践
傅里叶变换(深入浅出)
面试突击:什么是粘包和半包?怎么解决?
Postgresql源码(64)查询执行——子模块Executor(2)执行前的数据结构和执行过程
标准C语言学习总结11
友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议
MySQL如何一劳永逸的永久支持输入中文
七夕之前,终于整出了带AI的美丽秘笈
ctfshow php features
Handler source code analysis
flex布局
Brush the topic of mobile zero power button
Postgresql-xl global snapshot and GTM code walking (branch line)
X86 function call model analysis
[笔记]机器学习之前言介绍
Unity获取canvas 下ui 在屏幕中的实际坐标
Introduction to Cosine Distance
The addition and subtraction of the score of the force deduction brush question (a daily question 7/27)
MVC vs MVP
Postgresql source code (64) Query execution - data structure and execution process before submodule Executor (2) execution