如何在c++中使用snmpwalk
how to use snmpwalk in c++
我在代码中使用net-snmp。对于snmpget,我使用了这段代码,它是100%正确的。
string oiids = ".1.3.6.1.4.1.30429.1.3.2.1.0" ;
struct snmp_session session , *ss ;
struct snmp_pdu *pdu;
struct snmp_pdu *response;
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
int status;
init_snmp("APC Check");
snmp_sess_init( &session );
ss = snmp_open(&session);
session.peername = "192.168.17.74";
session.community = (u_char *) "public";
session.community_len = strlen("public");
session.version = SNMP_VERSION_2c;
ss = snmp_open(&session);
pdu = snmp_pdu_create(SNMP_MSG_GET);
read_objid(oiids.c_str(), anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
status = snmp_synch_response(ss, pdu, &response);
for(variable_list * vars = response->variables; vars; vars = vars->next_variable)
print_variable(vars->name, vars->name_length, vars);
但是此代码不适用于具有多行答案的OID。通过将此行pdu=snmp_pdu_create(snmp_MSG_GET)更改为pdu=snmp_pdu_create(snmp_MSG_GETNEXT);此代码只返回第一行。
这就是问题所在,我怎么能得到所有的行而不仅仅是第一个
GETNEXT
将在您指定的oid之后返回一个值。因此,您需要使用重复的GETNEXT
调用来遍历数据集。
GETBULK
也许正是你想要的。这将为您执行迭代,并尽可能多地返回。您仍然需要自己收集全套数据。
SNMPv2定义了获取批量操作,该操作允许管理应用程序一次检索表的一大部分。这个标准的get操作可以尝试检索多个MIB对象,但消息大小受代理的限制功能。如果代理不能返回所有请求的响应,它返回一条没有数据的错误消息。上的获取批量操作另一方面,告诉代理发送尽可能多的响应尽其所能。这意味着不完整的回答是可能的。
相关文章: