世の中、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で開放してると思うんだけど、一応ソースコード確認しておくかな・・・
ソースコード読んだ
・SNMP送信失敗はsnmp_synch_responseで開放
・Responseが無いときは_sess_async_send()で開放
・Responseがある時はリクエストリストにポインタをコピーしておき、受信かタイムアウトのタイミングで開放
一応これで一安心。