日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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动态监听自定义端口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。