2

我在我的代码中使用 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); 此代码仅返回第一行。

这就是问题所在,我怎么能得到所有行而不仅仅是第一行

4

1 回答 1

1

GETNEXT将在您指定的 oid 之后返回一个值。GETNEXT因此,您需要使用重复调用来遍历数据集。

GETBULK也许是你想要的。这将为您执行迭代并尽可能多地返回。您仍然需要自己收集完整的数据集。

SNMPv2 定义了 get-bulk 操作,它允许管理应用程序一次检索表的大部分。标准的 get 操作可以尝试一次检索多个 MIB 对象,但消息大小受代理能力的限制。如果代理不能返回所有请求的响应,它会返回一条没有数据的错误消息。另一方面,get-bulk 操作告诉代理尽可能多地发回响应。这意味着不完整的响应是可能的。

于 2012-07-17T09:35:13.723 回答