如何在C中使用snmpwalk?

问题描述 投票:0回答:1

我想使用 snmpwalk 之类的功能。

我想打印给定 OID 表中的所有用户,但当我使用 GETNEXT 时,我只获取第一行的值,而当我使用 GETNEXTBULK 时,我只获取第二个值。

这是代码:

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/library/mib.h>

int main() {
    oid target_oid[] = {1, 3, 6, 1, 4, 1, 89, 79, 17, 1, 1, 2, 107, 107};  
    size_t target_oid_len = OID_LENGTH(target_oid);

    init_snmp("snmpget");

    //SNMP session
    netsnmp_session session, *ss;
    snmp_sess_init(&session);
    session.peername = strdup("172.16.100.46");  
    session.version = SNMP_VERSION_2c;
    session.community = "public";
    session.community_len = strlen(session.community);

    SOCK_STARTUP;
    ss = snmp_open(&session);
    if (!ss) {
        snmp_perror("snmp_open");
        SOCK_CLEANUP;
        exit(1);
    }

    //SNMP GET request
    netsnmp_pdu *response;
    netsnmp_pdu *pdu = snmp_pdu_create(SNMP_MSG_GETBULK);
    pdu->non_repeaters = 0; pdu->max_repetitions = 15;
    snmp_add_null_var(pdu, target_oid, target_oid_len);


    int status = snmp_synch_response(ss, pdu, &response);
     
     if (status == STAT_SUCCESS && response->variables) {
        printf("%s\n", response->variables->val.string);}      
    else if (status == STAT_TIMEOUT) {
        fprintf(stderr, "SNMP Timeout\n");
    } else {
        snmp_sess_perror("snmpget", ss);
    }

    // Clean up
    if (response) {
        snmp_free_pdu(response);
    }
    snmp_close(ss);
    SOCK_CLEANUP;

    return 0;
}
c sockets snmp net-snmp
1个回答
0
投票

SNMP本身没有“walk”操作,这只是net-snmp给一系列连续的GET-NEXT请求起的名字。为了自己实现这一点,您需要使用一个循环来发出 GET-NEXT 请求,然后在下一个请求中使用响应中的 OID。

© www.soinside.com 2019 - 2024. All rights reserved.