C语言中如何使用snmpwalk?

kx5bkwkv  于 5个月前  发布在  PWA
关注(0)|答案(1)|浏览(61)

我想使用类似snmpwalk的功能。
我想从给定的数据表中打印所有的用户,但是当我使用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;
}

字符串

disho6za

disho6za1#

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

相关问题