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