因为最近在做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(陷阱)的相关开发,会在我接下来的博文中进行记录说明。
09-20 22:01