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の後に1つの値を返します。GETNEXTしたがって、繰り返し呼び出しを使用してデータセット全体を反復処理する必要があります。

GETBULKおそらくあなたが望むものです。これにより、反復が実行され、可能な限り返されます。データの完全なセットを自分で収集する必要があります。

SNMPv2 は get-bulk 操作を定義します。これにより、管理アプリケーションはテーブルの大きなセクションを一度に取得できます。標準の get 操作では、一度に複数の MIB オブジェクトを取得しようとすることができますが、メッセージ サイズはエージェントの機能によって制限されます。エージェントが要求されたすべての応答を返すことができない場合、エージェントはデータのないエラー メッセージを返します。一方、get-bulk 操作は、エージェントにできるだけ多くの応答を返すように指示します。これは、不完全な応答が可能であることを意味します。

于 2012-07-17T09:35:13.723 に答える