1. 程式人生 > >SNMP trap訊息為何不能正確發往指定埠162.

SNMP trap訊息為何不能正確發往指定埠162.

最近做網路攝像機,有局點要求需要按SNMP協議上報訊息,於是從網站http://www.net-snmp.org/下載了一個snmp原始碼包5.2.6,tar解壓,交叉編譯:

./configure --build=i686-linux --host=arm-merlin-linux CC=arm-merlin-linux-uclibc-gcc --with-mib-modules="examples/notification" --with-endianness=little LDFLAGS="-static"

(表示在x86的linuxOS上編譯板上執行的程式,build是編譯機,host是執行機,CC是編譯器名,target不需要,因為編譯出來的不是工具,加入一個notification的mib庫,如何加入mib,看官網上有,最後使用小端靜態編譯)

如果在PC上用,則./configure --with-mib-modules="examples/notification" 簡單的不得了

下面的程式碼演示如何從一個代理程序向管理程序上報trap訊息(此處用來發心跳),當然也可以通過配置snmp讓它自動上發trap訊息,但我們想程式設計自己靈活控制.

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <strings.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/time.h>

#include <time.h>

#include <sys/select.h>

#include <sys/socket.h>

#include <netdb.h>

#include <arpa/inet.h>

#include <net-snmp/net-snmp-config.h>

#include <net-snmp/net-snmp-includes.h>

int main()

{

netsnmp_session ,session;

static int i=0;

if (i==0)

{

snmp_sess_init(&session);

i=1;

}

session.version = SNMP_VERSION_2c;

session.peername = "192.168.1.3";

session.remote_port = 162;

session.community = (unsigned char*)"public";

session.community_len = strlen((char*)session.community);

session.retries = 3;

session.timeout = 2000;

session.sessid = 0;

snmp_session *ss = snmp_open(&session);

if (ss==NULL) return -1;

netsnmp_pdu *pdu = snmp_pdu_create(SNMP_MSG_TRAP2);

long sysuptime = get_uptime();

char csysuptime[32];

sprintf(csysuptime,"%ld", sysuptime);

oid oid_sysuptime[] = {1,3,6,1,2,1,1,3,0};

int status = snmp_add_var(pdu, oid_sysuptime,OID_LENGTH(oid_sysuptime),'t', csysuptime);

if (status !=0) return -1;//一般不會出錯

status = snmp_send(ss,pdu);

if (status == 0) return -2; //send要有東西發出去,返回0就不對了

snmp_close(ss);

return 0;

}

//以上的變數定義是按Effective C++的第XX條的原則:變數要到了用的時候才定義,個人喜歡這一條,所以堅持用了,除非是一些老的編譯器,變數定義必須放在前面,否則我不會先定義一大堆的變數放在那晾著.

編譯執行,管理程序未收到trap訊息(何為管理程序,何為代理程序,看看資料或<tcp/ip詳解 卷一就知道了)

抓包一看,發現訊息發到161埠去了,上百度搜了一下,發現人家也有同樣的問題,無果,最後幾番折騰,才在一個SNMP_API.H檔案裡看到一個結構體stuct snmp_session一行註釋:

/**UDP port number of peer (LO LONGER USED - USE peername INSTEAD)*/

u_short remote_port;

原來這個引數不用了,搞不懂為何要用peer_name來替代埠號,卻還讓remote_port這個欄位放在這繼續讓程式設計師犯錯,不用了為何不註釋掉這個欄位?讓人家編譯就能查錯總比執行時詭異要好的多吧.

修改一下程式碼:

session.peername = "192.168.1.3:162";//應該是用這個格式

再試一下../sendtrap(make後生成的執行檔案) 果然,管理程序正確收到訊息了.抓包也可以看到destination port是162了.

再把

session.remote_port = 0;,不影響正確性.

相關推薦

SNMP trap訊息為何不能正確指定162

最近做網路攝像機,有局點要求需要按SNMP協議上報訊息,於是從網站http://www.net-snmp.org/下載了一個snmp原始碼包5.2.6,tar解壓,交叉編譯: ./configure --build=i686-linux --host=arm-merlin-l

【NetSNMP##】 C語言傳送SNMP Trap訊息

專案需求系統利用SNMP Trap訊息上報狀態給NMS,考慮使用net-snmp提供的SNMP庫函式實現該功能,且需要根據不同埠使用不同的session。 1)標頭檔案 為了使用 netsnmp 的 API,必須 include 以下這些標頭檔案: #include &

SNMP:使用net-snmp捕捉trap

格式 -o pro 分享圖片 分享 命令 win7 gen exe 管理端:172.18.0.135 win7系統 代理端:172.18.0.212 Debian7.2 前提:代理端已配置snmp,可正常實現用SNMP協議實現系統信息監控 1、管理端下載ne

ActiveMQ中訊息的重與持久化儲存

訊息中介軟體解決方案續   上一篇中我們講到了在Spring工程中基本的使用訊息中介軟體,這裡就不在繼續贅述。   針對訊息中介軟體,這篇講解兩個我們常遇到的問題。   問題1:如果我們的訊息的接收過程中發生異常,怎麼解決?   問題2:釋出訂閱模式(Topic)下如果消費端宕機引起的訊息的丟失,怎麼

AI小白快上車!這是高薪職位的車!

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ AI到底有多火?看看下面這組資料: 騰訊研究院《2017全球人工智慧人才白皮書》報告中提到,現全球AI領域人才約30萬,而市場對人才的需求在百萬量級,每年從各大高校畢業的學生約2萬人,遠遠不能滿足市場對人

net-snmp擴充套件trap型別的私有mib

注:本文介紹的是靜態編譯的方法擴充套件的私有mib,別的方法請看本人整理的《net-snmp agent開發(用net-snmp擴充套件MIB庫)》 1. 首先建立一個簡單的含有table變數的mib檔案取名test-trap.mib,字尾名也可以是.txt 實際操作

RabbitMQ實戰-訊息確認機制之訊息正確消費

上節中我們講了如何確保訊息的準確釋出,今天我們來看看如何確保訊息的正確消費。 在之前的基礎上我們對消費者(倉庫服務)進行完善。 修改配置檔案application.yml 消費者的ack方式預設是自動的,也就是說訊息一旦被消費(無論是否處理成功),訊息都會被確認,然後會從

自己搭建的郵件系統不能gmail、hotmail等問題解決

在自己搭建的郵件系統上不能發往gmail、hotmail等國外郵箱的提示:你用於傳送電子郵件的IP未經授權。 主要原因是因為自己的IP地址在郵箱認證系統裡面被拉近黑名單。解決方法從郵箱認證系統黑名單裡面恢復自己的IP地址,由於我是使用的固定IP,在動態IP上沒試過,不過有

微信小程式如何傳送訂閱訊息正確姿勢來了,建議收藏!

小程式訂閱訊息公測已經有些日子,今天以世界上最好的語言(PHP)為例,說一下如何傳送訂閱訊息。 1、訂閱訊息 其實如果用過模板訊息的話,改用訂閱訊息挺簡單的,看一下官方文件稍加摸索就能使用。 但是對於那些第一次用的萌新來說,可能會遇到各種各樣的坑,所以我會具體的說一下實現的過程,有經驗的可以直接翻到文章底部檢

jenkins將構建成功或失敗的信息送給指定URL(eg: pomelo采用jenkins持續集成)

2.7 http請求 pom last div 集成 一個 jenkins 一次 先提供一個思路供大家參考,想將構建成功或者失敗的信息發送給指定URL的話,可以這樣:1、A構建後觸發另一個構建B,構建B執行某個插件2、插件的功能: (1)利用jenkins API獲取

初探JS-html5移動端指定內容短信到指定號碼

鏈接 nav navigator 屬性 ava inpu params document san 原理:利用a標簽跳轉指定網址: sms://[號碼]?body=[內容] //安卓 sms://[號碼]&body=[內容] //IOS 首先

Python修改檔案指定行插入內容

需求:批量修改py檔案中的類屬性,為類增加一個core = True新的屬性 原py檔案如下 a.py class A(): description = "abc" 現在有一個1.txt文字,內容如下,如果有py檔案中的description跟txt文字中的一樣,則增加

list指定的下標插入元素

osi sys imp mar 下標 oid public util port list往指定的下標插入元素 import java.util.*; public class ListExample{ public static void main(String[]

PHP 結合前端 ajax 爬取網站信息後, 向指定用戶指定短信;

icloud identity coo 請求頭 array -type aid 前端 之前 &lt;?php /** * Description * @authors Your Name ([email protected]) * # 根據時時彩的最新一期的號碼

python ZeroMQ實現1:N,非同步收發訊息(也可向指定客戶端傳送訊息

ZeroMQ的python版本和C/C++版本的介面差不多,要實現一個server對N個client,非同步方式,而且可以對指定的client傳送訊息,可以這樣: server採用ROUTER方式,cl

SNMP功能開發簡介 三 使用DEBUGMSG列印指定的資訊

net-snmp自己提供了豐富的除錯引數,可以列印指定的想要資訊。 //假定token是"snmpd" /* 註冊token值 */ debug_register_tokens("snmpd"); /* 開啟debug列印功能 *

C/C++編寫一個定時串列(虛擬串列)傳送資料的程式

利用C/C++來設計一個定時往串列埠(虛擬串列埠)傳送資料的程式,包括虛擬串列埠的配置與串列埠的接收顯示資料: 程式如下: #include<iostream> #include<windows.h> using namespace std;

JS 字串操作函式 指定位置插入字元 刪除指定位置字元 替換指定位置字元

刪除指定字元 var str="xxxxxxxxabcxxxxxxxxxxxx"; var pattern = "abc"; str = str.replace(new RegExp(pattern), ""); console.log(str); 執行結果就是xxxxxxxxxxxxxxxxx

"無法連線到印表機。 您或者輸入印表機名不正確, 或指定印表機是否不再連線到伺服器。"錯誤提示的解決

 無論是直接雙擊安裝,還是通過填加網路印表機輸入“//ip/共享印表機名”都是提示這個錯誤:無法連線到印表機。 您或者輸入印表機名不正確, 或指定印表機是否不再連線到伺服器。 單擊 " 幫助 " 檢視詳細資訊。為什麼在同一個網段、同一個工作組,電腦都是xp系統,一臺電腦共享出

MySQL入門——修改資料表2:指定的表中新增多列資料(欄位)

增加多列,多個列的定義與宣告需要用小括號括起來,每個欄位之間用逗號隔開。 例如,往user2表中一次性新增2三個欄位salary、sex、address欄位,寫法如下: ALTER TABLE