SNMP关于net snmp执行命令的接口封装(一)
2015-06-23 14:07
357 查看
1.Linux环境
略
2.安装
net snmp开源软件
http://www.net-snmp.org/docs/man/
3.需求背景
目前准备做一个设备网管,采用snmp协议,目前刚刚研究snmp相关,下面是要做的事情:
4.接口封装
今天仅仅只是做了简单实验,也不知道这样是不是可行的。直接代码吧。
运行情况:
[root@x64-dev ~]# ./popen
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 484676 kB
望各位对snmp有经验的大神多多指教,多谢。
略
2.安装
net snmp开源软件
http://www.net-snmp.org/docs/man/
3.需求背景
目前准备做一个设备网管,采用snmp协议,目前刚刚研究snmp相关,下面是要做的事情:
web server 第三方网管 -----------|--------------------------------------|-------------- | | |-------json---------|-------snmp------| net-snmp client/manager | |适 配 层| --------------------------------|--------------------------------- snmp | net-snmp agent 设 备 其中web server是内部的一套设备网管(B/S架构),第三方网管采用snmp协议,内部的网管采用json格式请求,目前要做的事情就是不管是第三方还是内部网管下来的请求是什么格式(json or snmp),到设备这一层都是snmp,这样的话,就要在适配层做一个解析封装模块(json<-->snmp),这个是上面要求的,本来做成两套很容易实现。 这样搞的话,目前要做的两件事,第一件事情,在net-snmp client/manager这一层,封装snmp相关命令接口(get、set等),注意区分版本(v1,v2,v3),主要是格式问题。第二件事情,实现适配功能,就是将上层下来的json请求解析成snmp方式,应答时转换成json格式。
4.接口封装
今天仅仅只是做了简单实验,也不知道这样是不是可行的。直接代码吧。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFF_SIZE 80 typedef struct { char *p_cmd_name;//snmpget/set等 char *p_version;//v1/V2/V3 char *p_community;//public char *p_ip_address;//设备ip char *p_oid;//MIB对应的oid信息 }snmp_cmd_s; void create_snmp_cmd(const snmp_cmd_s *p_cmd_struct, char *p_cmd) { if(NULL == p_cmd_struct || NULL == p_cmd) { printf("error : NULL pointer.\n"); return; } memset(p_cmd, 0, strlen(p_cmd)); //创建v1、V2的命令 strncpy(p_cmd, p_cmd_struct->p_cmd_name, strlen(p_cmd_struct->p_cmd_name)); strncat(p_cmd, " ", strlen(" "));//加空格 strncat(p_cmd, "-v", strlen("-v"));//命令格式 strncat(p_cmd, " ", strlen(" "));//加空格 strncat(p_cmd, p_cmd_struct->p_version, strlen(p_cmd_struct->p_version));//1or2c strncat(p_cmd, " ", strlen(" "));//加空格 strncat(p_cmd, "-c", strlen("-c"));//命令格式 strncat(p_cmd, " ", strlen(" "));//加空格 strncat(p_cmd, p_cmd_struct->p_community, strlen(p_cmd_struct->p_community));//public strncat(p_cmd, " ", strlen(" "));//加空格 strncat(p_cmd, p_cmd_struct->p_ip_address, strlen(p_cmd_struct->p_ip_address));//dev ip strncat(p_cmd, " ", strlen(" "));//加空格 strncat(p_cmd, p_cmd_struct->p_oid, strlen(p_cmd_struct->p_oid));//mib oid //strncat(p_cmd, " ", strlen(" "));//加空格 ,最后一个空格不需要 return; } int exec_snmp_cmd(const char *p_cmd) { FILE *fp; char buffer[BUFF_SIZE] = {0}; if (NULL == (fp = popen(p_cmd, "r"))) { perror("error : Fail to popen.\n"); exit(1); } while(NULL != fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } pclose(fp); return 0; } int main(void) { #if 0 int ret = exec_snmp_cmd("cat /etc/passwd"); if (ret) { printf("error : set snmp cmd failed.\n"); } #endif char cmd_str[BUFF_SIZE] = {0}; snmp_cmd_s snmp_walk_cmd = { "snmpwalk", "1", "public", "127.0.0.1", /*"sysDescr",*/ ".1.3.6.1.4.1.2021.4.5.0",//查看内存容量的oid }; //1.创建命令 create_snmp_cmd(&snmp_walk_cmd, cmd_str); //2.执行命令 exec_snmp_cmd(cmd_str); return 0; }
运行情况:
[root@x64-dev ~]# ./popen
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 484676 kB
望各位对snmp有经验的大神多多指教,多谢。
相关文章推荐
- Linux ALSA声卡驱动之八:ASoC架构中的Platform
- Android消息处理机制
- Linux ALSA声卡驱动之七:ASoC架构中的Codec
- 【swift_4】swift之代理传值(delegate的用法)
- IIS建立FTP站点
- 一行代码给网站添加功能
- BitmapShader的TileMode对比
- rc.local 和init.d的作用
- mysql too many connections解决
- NSThread 售票员售票问题
- Linux ALSA声卡驱动之六:ASoC架构中的Machine
- 正则匹配URL地址
- 什么是blob,mysql blob大小配置介绍
- 黑马程序员JAVA笔记9--反射
- 修改 QQ 聊天记录保存路径 ,并禁止随意更改
- 在zabbix中添加监控主机及Items
- centOS安装telnet服务和xinetd服务和iptables和linux运行级别
- javascript 数据类型
- 【BZOJ2823】【AHOI2012】信号塔 最小圆覆盖 计算几何
- ORACLE常用SQL命令