因为最近在做SNMP的开发,也就是NMS的开发工作,对SNMP有点心得,希望可以分享自己的经验,达到和大家交流,学习的机会。
1:open snmp
struct snmp_session session;
//snmp会话的初始化工作
snmp_sess_init(&session);
//填充结构体session中部分成员变量
.......
SOCK_STARTUP;
snmp_open(&session);
2:发送PDU
struct snmp_pdu* pdu = NULL;
struct snmp_pdu* response = NULL;
pdu = snmp_pdu_create(SNMP_MSG_GET);
snmp_parse_oid(...);
snmp_add_null_var(...);
snmp_synch_response(....);
3:解析oid_value
通过SNMP库定义的SNMP oid_value 的类型,来处理值
4:close SNMP
(void)snmp_close(session);
SOCK_CLEANUP;
这个流程相对简单,get_next和set略有差别,但整体一样。
以上结构体和相关API,请查看源码。
在项目后期,我使用Valgrind进行内存检测时,发现严重的内存泄露。
后来分析NET-SNMP库源码,定位出原因:在snmp_open内部维护了一个全局变量(主要是基于效率考虑),导致的内存泄露。
当然 这样的泄露,是有益的 "泄露"。
另外,关于trap(陷阱)的相关开发,会在我接下来的博文中进行记录说明。