歷史經驗之使用Snmp 獲取MIB表

2021-10-06 09:19:42 字數 1432 閱讀 6931

snmp++是一套強大的網路管理應用開發包。它提供了snmp網管協議所描述的所有命令,並且提供smi資料型別的解析。mib資料報含普通資料和表資料。在提取表資料時,由於表項的數量和oid都不確定,所以不能通過某個特定的oid直接獲得取值。通常,關於snmp的書上都會介紹使用getnext命令來實現表的遍歷,這種方法比較簡單,這裡主要討論該演算法的原理和如何用snmp++實現。

mib表是通過行和列來描述的。其中列表頭是各個表項的原始oid,而行表頭則是index。這樣以來乙個oid和乙個index就唯一地確定了表中的一項。比如在介面表中,ifdescr(oid為1.3.6.1.2.1.2.2.1.2)為一列,而具體對於某乙個介面則為一行。這樣,某一具體表項的oid就表示為:列oid+index的形式。下圖形象地描述了一張表的格式。

ifindex

1.3.6.1.2.1.2.2.1.1 ifdescr

1.3.6.1.2.1.2.2.1.2 iftype

1.3.6.1.2.1.2.2.1.3 ifmtu

1.3.6.1.2.1.2.2.1.4 ifspeed

1.3.6.1.2.1.2.2.1.5

index0 *** *** *** *** ***

index1 *** *** *** *** ***

index2 *** *** *** *** ***

在這裡進行資料處理*/}

else

}else}}

以上的演算法是從表中提取一列,那麼如何提取一行呢?對於上述演算法可以加以改進以適應我們的需要。但是,getnext命令是按列遍歷的,當我們要用它獲得一行的時候還是必須先至少獲得一列的資訊,也就是說,在行遍歷演算法中還是要包含上述**。這種方法經過實踐是成功的,在這裡僅對演算法進行一下描述。

首先還是要執行上述**,但是,在資料處理的時候必須儲存所得到的完整oid。我們知道,得到的oid實際上是由列oid+index構成,而列oid是已知的,那麼如果我們將得到的oid前面的列oid部分替換為另外的列oid就可以獲得該行另一列的完整oid。在多數情況下,同一表中不同的列oid僅相差乙個數字,所以,替換方法也比較簡單。這裡假設我們只需替換一位(其它情況下只需做修改即可),演算法如下:

//按行提取表資料

oid row_oid[max_oid_num];

/*首先在此處包含前面按列提取的**,

並在資料處理處將full_oid儲存在陣列row_oid

*///假設前面已經將第一列的所有表項oid儲存在陣列row_oid中了

//按行迴圈

for(int i=0; iget( pdu, target))== snmp_class_success)

else

}實際上,snmp提取表資料的方法有很多,這裡介紹的是最簡單最基礎的一種方法。而且對於不同的開發包,還有更好的對錶支援的方法,比如adventsnmp開發包就有直接的表操作函式。無論採用何種方法,了解最基本的工作原理都非常有幫助。

團隊建設 歷史經驗回顧

近期公司希望能夠開始對專案流程進行整頓,所以希望我能夠對團隊成員提供一些相關培訓.今天是第一天,也是第一次對團隊成員進行培訓.這裡準備了一點ppt作為自己培訓的資料.作為第一天開始,個人思路是總結歷史,展望未來.如果歷史可以給我們再來一次的機會我們會如何做?在會上發出紙請與會同事針對以往的專案經驗提...

MySQL5之使用經驗

mysql5支援檢視 儲存過程 觸發器等高階特性了,終於象個完整的資料庫了!很高興啊,我們做專案的時候選擇性更強了。不過在我乙個實際的 專案中,發現事實和看上去的不太相同啊。是否支援這些特性和支援得多好畢竟是不同的問題!比如在使用oracle時,發現在9i上能正確執行的統計sql到8i上居然報錯,無...

AWS之SQS訊息佇列使用經驗

1 問 什麼是可見性超時?可見性超時是乙個時段,在這個時段內,amazon sqs 會阻止其他處理元件接收和處理某條訊息。有關更多資訊,請參閱 amazon sqs 開發人員指南中的可見性超時。這個特性,在工作當中,我們可以提高基於sqs訊息服務的併發能力。比如有1000個sqs client在監聽...