C言語でSNMPの送受信

2010/07/14 | By KUMA | Filed in: 技術メモ.

世の中、SNMP AgentをC言語で実装する記事はあるのだが、SNMPマネージャをC言語で書く記事がないなぁと思って、C言語からコマンドラインのsnmpgetをpopenで呼んだりしてたのだが、オーバーヘッドの大きさに閉口。
本格的に探したところ、サンプルが公式にあったorz

公式のサンプルからさらに最低限必要な処理を抽出する。

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <string.h>

int main(int argc, char ** argv)
{
 struct snmp_session session;
 struct snmp_session *sess_handle;

 struct snmp_pdu *pdu;
 struct snmp_pdu *response;

 struct variable_list *vars;

 oid id_oid[MAX_OID_LEN];
 oid serial_oid[MAX_OID_LEN];

 size_t id_len = MAX_OID_LEN;
 size_t serial_len = MAX_OID_LEN;

 int status;

 /*********************/

 init_snmp("SNMP Test");

 snmp_sess_init( &session );
 session.version = SNMP_VERSION_1;
 session.community = "public";
 session.community_len = strlen(session.community);
 session.peername = "127.0.0.1";
 sess_handle = snmp_open(&session);

 pdu = snmp_pdu_create(SNMP_MSG_GET);

 read_objid(".1.3.6.1.2.1.1.1.0", id_oid, &id_len);
 snmp_add_null_var(pdu, id_oid, id_len);

 status = snmp_synch_response(sess_handle, pdu, &response);

 for(vars = response->variables; vars; vars = vars->next_variable)
 print_value(vars->name, vars->name_length, vars);

 snmp_free_pdu(response);
 snmp_close(sess_handle);

 return (0);
}

このサンプル見てておもったのだが、snmp_pdu_create()で返ってきたポインタって、開放してないんだよね。
requestとsess_handleは開放してるっぽいAPI呼んでるからいいんだけど…

いろいろグクっても開放しているところが見当たらないから、たぶんsnmp_synch_responseで開放してると思うんだけど、一応ソースコード確認しておくかな・・・


Tags: , ,

One comment on “C言語でSNMPの送受信

  1. KUMA より:

    ソースコード読んだ
    ・SNMP送信失敗はsnmp_synch_responseで開放
    ・Responseが無いときは_sess_async_send()で開放
    ・Responseがある時はリクエストリストにポインタをコピーしておき、受信かタイムアウトのタイミングで開放
    一応これで一安心。