SNMP功能开发简介 四 net-snmp动态监听自定义端口

SNMP项目有个需求,就是能够动态改变net-snmp监听的端口而不需要重启设备。关于这个功能,一开始想的是如果端口变更了,那就直接使用pthread_kill 关闭原来的代理线程,然后重新执行线程。但是这样子测试后发现重启的线程会自动导致整个进程退出。

模块框架大致是这样,进程启动读取配置,然后创建一个独立的代理线程,这个线程执行net-snmp库的启动入口(snmpd.c/SnmpDaemonMain)。

实测发现该接口不能够重新执行,因为第一次执行的时候库里面的很多静态变量已经初始化,在进程内这些变量只会初始化一次,所以当后续的线程重新调用net-snmp库的入口会初始化失败。照这样打算以多进程的方式来实现这个功能,毕竟进程的数据是独立的。不过这样开发的话进程之间的通信也是一个问题,想想这个复杂度还是算了。之前分析过库的执行代码,对库的运行流程有了基本的了解,既然是重新监听端口,那就将之前的端口关掉,重新执行以便就好了。

如上图所示,打开监听端口是在init_master_agent里面,分析了里面的函数调用,大致流程搞清楚后,在库里增加了几个接口用于更新端口:

/* 相当于关闭之前的agent */
shutdown_master_agent()

/* 关闭执行的所有会话 */
snmp_close_sessions();

/* 重新执行下列步骤来刷新端口 */

/* 重新初始化库内部使用的一个结构体 */
_init_agent_callback_transport();


/* 因为snmp_close_sessions 关闭了所有会话,所以这里要重新创建 */
if (agentx_callback_sess == NULL) {
        agentx_callback_sess = netsnmp_callback_open(callback_master_num,
                                                     handle_subagent_response,
                                                     NULL, NULL);
        DEBUGMSGTL(("agentx/subagent", "subagent_init sess %p\n",
                    agentx_callback_sess));
}

接下里重新调用正常的流程就可以了
init_master_agent()

如果有其它特殊的功能需要开发并且库自身并不支持的话,可以多看看net-snmp源码,尝试修改就可以了。

猜你喜欢

转载自blog.csdn.net/fuyuande/article/details/83212743
今日推荐