简单网络协议SNMP之net-snmp开发snmpget

目的:通过net-snmp关于snmpget源码的开发,从snmp代理设备获得自己想要的信息

准备:从http://www.net-snmp.org/网址下载net-snmp-5.6.1.1.tar.gz源码包

 

开发过程:

1.解压源码

2.进入解压源码的目录

1) Run ./configure --prefix=/usr/local/net-snmp
     (type "./configure --help" for a quick usage summary.)
     (--prefix=PATH will change the default /usr/local installation path.)
     (see "Compilers and Options" on changing the compiler to use)

 2) make

 3) make install

3.安装完毕

在/usr/local/net-snmp底下内容如下:

root@an-virtual-machine:/usr/local/net-snmp# ls
bin  include  lib  sbin  share

进入lib,可以看到内容如下:

root@an-virtual-machine:/usr/local/net-snmp/lib# ls
libnetsnmp.a                 libnetsnmpmibs.la
libnetsnmpagent.a            libnetsnmpmibs.so
libnetsnmpagent.la           libnetsnmpmibs.so.25
libnetsnmpagent.so           libnetsnmpmibs.so.25.0.2
libnetsnmpagent.so.25        libnetsnmp.so
libnetsnmpagent.so.25.0.2    libnetsnmp.so.25
libnetsnmphelpers.a          libnetsnmp.so.25.0.2
libnetsnmphelpers.la         libnetsnmptrapd.a
libnetsnmphelpers.so         libnetsnmptrapd.la
libnetsnmphelpers.so.25      libnetsnmptrapd.so
libnetsnmphelpers.so.25.0.2  libnetsnmptrapd.so.25
libnetsnmp.la                libnetsnmptrapd.so.25.0.2
libnetsnmpmibs.a

4.在Qtcreator,新建一个项目TestNetSNMp

把上面lib里面的libnetsnmp.a  放到项目底下

在.pro里面添加内容如下:
INCLUDEPATH +=/usr/local/net-snmp/include

LIBS += -L/root/wyz/TestNetSNMP -lnetsnmp

 

5.在main里面添加代码如下:

#include <net-snmp/net-snmp-config.h>

#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif
#include <sys/types.h>
#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include <stdio.h>
#include <ctype.h>
#if TIME_WITH_SYS_TIME
# ifdef WIN32
#  include <sys/timeb.h>
# else
#  include <sys/time.h>
# endif
# include <time.h>
#else
# if HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#if HAVE_WINSOCK_H
#include <winsock.h>
#endif
#if HAVE_NETDB_H
#include <netdb.h>
#endif
#if HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif

#include <net-snmp/utilities.h>

#include <net-snmp/net-snmp-includes.h>
#include <vector>
#include <map>
#include <iostream>
using namespace  std;

#define NETSNMP_DS_APP_DONT_FIX_PDUS 0

 

string fprint_variable_1(const oid * objid,size_t objidlen, const netsnmp_variable_list * variable)
{
    u_char         *buf = NULL;
    size_t          buf_len = 256, out_len = 0;
    if ((buf = (u_char *) calloc(buf_len, 1)) == NULL) {
        
        return "";
    } else {
        if (sprint_realloc_variable(&buf, &buf_len, &out_len, 1,
                                    objid, objidlen, variable)) {
            string strTemp((char*)buf);
            
            int iFirst=strTemp.find_first_of(":");
            string strInfo=strTemp.substr(iFirst,strTemp.length()-1);
            
            return strInfo;
            
        } else {
            fprintf(stdout, "%s [TRUNCATED]\n", buf);
        }
    }
    SNMP_FREE(buf);
}

string fprint_variable_2(const oid * objid,size_t objidlen, const netsnmp_variable_list * variable)
{
    u_char         *buf = NULL;
    size_t          buf_len = 256, out_len = 0;
    if ((buf = (u_char *) calloc(buf_len, 1)) == NULL) {
        
        return "";
    } else {
        if (sprint_realloc_variable(&buf, &buf_len, &out_len, 1,
                                    objid, objidlen, variable)) {
            string strTemp((char*)buf);
            
            return strTemp;
            
        } else {
            fprintf(stdout, "%s [TRUNCATED]\n", buf);
        }
    }
    SNMP_FREE(buf);
}

string SnmpGet(char *community,char *ip,char *oid_array)//snmpget -v2c -c public 10.0.0.11 1.3.6.1.2.1.1.5.0
{
    netsnmp_session session, *ss=(netsnmp_session*)malloc(sizeof(netsnmp_session));
    netsnmp_pdu    *response=(netsnmp_pdu*)malloc(sizeof(netsnmp_pdu));
    
    netsnmp_variable_list *vars=NULL;
    netsnmp_pdu    *pdu;
    
    if(!ss)
        ss = (netsnmp_session*)malloc(sizeof(netsnmp_session));
    if(!response)
        response=(netsnmp_pdu*)malloc(sizeof(netsnmp_pdu));
    
    
    int             count;
    int             current_name = 0;
    char           *names[SNMP_MAX_CMDLINE_OIDS];
    oid             name[MAX_OID_LEN];
    size_t          name_length;
    int             status;
    int             failures = 0;
    int             exitval = 0;
    
    snmp_sess_init(&session);
    
    session.version = SNMP_VERSION_2c;
    
    session.peername = ip;
    session.community = (unsigned char*)community;
    session.community_len = strlen(community);
    
    
    names[0] = oid_array;
    current_name = 1;
    
    SOCK_STARTUP;
    
    snmp_close(ss);
    ss = snmp_open(&session);
    
    if (ss == NULL) {
        snmp_sess_perror("snmpget", &session);
        SOCK_CLEANUP;
        return "";
    }
    
    pdu = snmp_pdu_create(SNMP_MSG_GET);
    for (count = 0; count < current_name; count++) {
        name_length = MAX_OID_LEN;
        if (!snmp_parse_oid(names[count], name, &name_length)) {
            snmp_perror(names[count]);
            failures++;
        }
        else
        {
            snmp_add_null_var(pdu, name, name_length);
        }
    }
    if (failures) {
        snmp_close(ss);
        SOCK_CLEANUP;
        return "";
    }
    
    retry:
    status = snmp_synch_response(ss, pdu, &response);
    if (status == STAT_SUCCESS) {
        if (response->errstat == SNMP_ERR_NOERROR)
        {   
            vars = response->variables;
            
            string strTemp=fprint_variable_1(vars->name, vars->name_length, vars);
            
            return strTemp;
        }
        else
        {
            printf("2\n");
            fprintf(stderr, "Error in packet\nReason: %s\n",
                    snmp_errstring(response->errstat));
            
            if (response->errindex != 0) {
                fprintf(stderr, "Failed object: ");
                for (count = 1, vars = response->variables;
                     vars && count != response->errindex;
                     vars = vars->next_variable, count++)
                    /*EMPTY*/;
                if (vars) {
                    fprint_objid(stderr, vars->name, vars->name_length);
                }
                fprintf(stderr, "\n");
            }
            exitval = 2;
            
            
            if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
                                        NETSNMP_DS_APP_DONT_FIX_PDUS)) {
                pdu = snmp_fix_pdu(response, SNMP_MSG_GET);
                snmp_free_pdu(response);
                response = NULL;
                if (pdu != NULL) {
                    goto retry;
                }
            }
        }                       /* endif -- SNMP_ERR_NOERROR */
        
    } else if (status == STAT_TIMEOUT) {
        fprintf(stderr, "Timeout: No Response from %s.\n",
                session.peername);
        exitval = 1;
        
    } else {                    /* status == STAT_ERROR */
        snmp_sess_perror("snmpget", ss);
        exitval = 1;
        
    }                           /* endif -- STAT_SUCCESS */    
    
    if (response)
        snmp_free_pdu(response);
    snmp_close(ss);
    
    SOCK_CLEANUP;
    
    return "";
}

   int main()
{
    string strSnmpInfo;
    //    strSnmpInfo=SnmpGet("2c","public","192.168.1.241",".1.3.6.1.4.1.11.2.3.9.1.1.7.0");
    //    strSnmpInfo=SnmpGet("2c","public","192.168.1.241",".1.3.6.1.2.1.1.1.0");
    strSnmpInfo=SnmpGet("public","192.168.1.133","1.3.6.1.2.1.1.1.0");
      
    cout<<"wyz---------------snmpInfo::"<<strSnmpInfo<<endl;
    return 0;
}


 

编译,运行结果如下:

 root@an-virtual-machine:~/wyz/TestNetSNMP-build-desktop# ./TestNetSNMP
wyz---------------snmpInfo::: "Linux an-virtual-machine 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686"

 

 

 

 

 

你可能感兴趣的:(String,session,网络协议,null,include,compiler)