SNMP简单网络管理协议总结,支持多种认证和加密方式

本文档提供了一个简单的SNMP协议实现,包括SNMP V1, V2C, V3版本的支持,以及SHA和MD5认证,DES和AES加密方式。代码中定义了SNMP版本、认证和加密方式的枚举类型,并展示了如何配置和初始化SNMP会话,以及获取网络设备的CPU和内存信息。此外,还提供了针对通用和Cisco设备的内存和CPU利用率的获取函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单网络管理协议(SNMP)是设计用于IP网路管理网络节点的一种标准协议,它是应用层协议

SNMP协议目前在用的有3个版本,分别是V1,V2C,V3版本

认证方式有SHA,MD5

加密方式有DES,AES

需要支持版本、认证、加密不同的方式功能

自己也是各种找资料,但是很多资料都是复制粘贴,也不全;

所以就把自己的部分实现贴出来,仅供参考:

/*
*@author: 赵秋然
*@date:2021年8月7日
*@description:snmp.h
*/
#ifndef __SNMP_H__
#define __SNMP_H__
#include "public.h"
#include "cJSON.h"
#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<net-snmp/net-snmp-config.h>
#include<net-snmp/net-snmp-includes.h>
#define SNMP_CONF "/backend-c/snmp/snmp_device.conf"

///snmp版本类型
typedef enum{
    SNMP_V1 = 1,
    SNMP_V2,
    SNMP_V3
} snmp_v;

//snmp认证方式
typedef enum{
    NOAUTH = 0,
    SHA,
    MD5
} auth_t;

//snmp加密连接方式
typedef enum{
    OPRIV = 0,
    DES,
    AES
} priv_t;

//snmp 机器类型
typedef enum{
    COMMON = 0,
    CISCO
} machine_t;


// snmp 通用机器内存 oid信息枚举
typedef enum{
    MEMTOTAL = 0,
    MEMAVAILABLE,
    MEM_SHARE,
    MEM_BUFFER,
    MEM_CACHE
}machine_common;

typedef enum{
    MEM_USE = 0,
    MEM_UNUSE
}machine_cscio;

#define RES_LEN 10
#define OID_LEN 30
#define LEN 256
#define SUCCE  0
#define ERROR -1

typedef struct snmp_basic_i{
    int snmp_on; // snmp主服务启用
    int snmp_cycle_time;//服务更新设备间隔(秒)
    int snmp_count;//snmp设备个数统计
}snmp_basic_info;

typedef struct snmp_machine{
    int snmp_device_on;//当前设备是否启用获取
    char m_ip[20]; // 机器ip
    int snmp_version;// snmp 版本号
    int snmp_auth;//snmp加密方式
    int snmp_ency;//snmp认证方式
    char community[LEN]; //snmp 团体字
    int time_cycle;// 获取周期时间 5秒 10秒等更新周期
    char security_name[LEN];//登录名称
    char security_pass[LEN];//密码
    char priiv_pass[LEN];//私钥
    struct timeval cur_time;///开始获取时间  戳   上一次更新的时间戳
    int machine_type;// 机器分类     common  思科  后续需要扩展
    char machine_name[LEN];// 机器名称
    char machine_id[LEN];// 机器id
    char cpu_oid[5][OID_LEN];// cpu oid
    char mem_oid[6][OID_LEN];// 内存  oid
    char cpu_use_percent[RES_LEN];//cpu 使用率
    char mem_use_percent[RES_LEN];//内存使用率
    netsnmp_session s_session;
}snmp_machine_info;

int is_valic_ip(char *ip);
int snmp_get_info(netsnmp_session * session,char *dest_ip ,char * oid_val, int * res);
int snmp_dialog_create(snmp_machine_info   * snmp_machine,snmp_basic_info snmp_info);
int snmp_basic_conf(snmp_basic_info * snmp_info,cJSON  * root);
int snmp_device_conf(snmp_machine_info * machine,cJSON  * root);
int snmp_config_init(snmp_machine_info   ** snmp_machine,snmp_basic_info * snmp_info);
int get_cycle_second(struct timeval  mache,int mache_time_cycle);


//通用 机器cpu 内存获取
void   snmp_common(snmp_machine_info *snmp_machine);
//思科 路由 cpu 内存获取
void   snmp_cisco(snmp_machine_info *snmp_machine);
void snmp_get_message(snmp_machine_info * snmp_machine);
void snmp_interval_get(snmp_machine_info *snmp_machine,snmp_basic_info snmp_info);
void snmp_free(snmp_machine_info * snmp_machine);
void * snmp_init(void * tmp);
void snmp_start();
#endif
/*
*@author: 赵秋然
*@date:2021年8月7日
*@description:snmp.c
*/
#include "snmp.h"
int quit = 0;
pthread_t snmp_tid;

int is_valic_ip(char *ip){
    if(ip == NULL){
        return ERROR;
    }

    char  ip_val[30] = {'\0'};
    int a,b,c,d;
    strncpy(ip_val,ip,sizeof(ip_val)/sizeof(char)-1);
    if (4==sscanf(ip_val,"%d.%d.%d.%d",&a,&b,&c,&d)){
        if (0<=a && a<=255
                && 0<=b && b<=255
                && 0<=c && c<=255
                && 0<=d && d<=255){
            return SUCCE;
        }
    }
    return ERROR;
}

int snmp_get_info(netsnmp_session * session,char *dest_ip ,char * oid_val, int * res){
    netsnmp_session * ss = NULL;
    netsnmp_pdu * pdu;
    netsnmp_pdu * response;
    struct variable_list *vars;
    int status;
    if(session == NULL || dest_ip == NULL || oid_val == NULL || res == NULL){
        printf("snmp_get_info parameter is error \n");
        return STAT_ERROR;
    }

    if(is_valic_ip(dest_ip)){
        printf("snmp_get_info is_valic_ip ip is error \n");
        return STAT_ERROR;
    }

    session->peername =strdup(dest_ip) ;
    ss = snmp_open(session);
    if(ss == NULL){
        snmp_sess_perror(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值