SNMP功能开发简介 四 net-snmp动态监听自定义端口
生活随笔
收集整理的這篇文章主要介紹了
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源碼,嘗試修改就可以了。
總結
以上是生活随笔為你收集整理的SNMP功能开发简介 四 net-snmp动态监听自定义端口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长城坦克5007座版二排座椅前后可调吗?
- 下一篇: SNMP功能开发简介 五 使用MIB B