2012-07-02 95 views
2

我正在嘗試編寫一個SNMP代理程序,坦率地說,整個過程就像閱讀有限的立體聲指令一樣。但是我很接近,除了一個問題:實現GETNEXT操作。SNMP OID樹步行

考慮系統OID空間的以下塊:

.1.3.6.1.2.1 .1.5.0 
      .1.6.0 
      .1.8.0 
      .1.9.1 .2.1 
        .2.2 
        .2.3 

對於確定性,讓我們說,我想這樣做

$ snmpwalk -On -v 2c -c public localhost .1.3.6.1.2.1.1.8.0 

的net-snmp首先執行GET上實現了這一點。 1.8.0,然後是GETNEXT。 GETNEXT應該從.1.8.0到.1.9.1.2.1,然後是.1.9.1.2.2等等。

我認識到這是概念僅僅是一個深度第一次散步,但由於某些原因 - 年齡,也許 - 我不能想出一個乾淨的方式來實現該搜索時,它必須找到GET節點,然後備份下一個呼叫並找到「下一個」節點。

隨意告訴我,這是愚蠢的簡單。

更新

我寫這一個26小時編程回合後,我可以想像,目前還不清楚。這裏的問題是:

我需要一個函數後繼它需要一個OID作爲輸入,並返回下一個OID - 其中下一個深度優先順序,由SNMP工具實現。我有幾個解決方案可以通過深度優先順序枚舉OID並等待正確的OID進行工作。我在尋找一個比O(l + n)更好的優雅例子,其中l是OID的長度,n是OID的數量。

+0

那麼,你的意思是你不明白爲什麼Net-SNMP在一開始就發送GET消息?我也不知道,因爲其他工具包(如#SNMP)中的snmpwalk不執行此額外的GET。 –

+0

這就是另外一個問題,即如何確定一個被認爲是一個長期建立的標準的東西,最終會導致這麼多相互矛盾的行爲。 –

+0

不幸的是,walk不是標準的一部分(與GET/GET NEXT/SET等相比,RFC文檔都沒有強調它)。因此,對於這樣的非標準操作,供應商可以自由地以不同的方式實施。 –

回答

-1

檢查響應PDU中的每個OID是否與正在行走的根OID相對應。如果你找到一個匹配,那麼你知道停止遍歷樹。如果找不到匹配項,請發送下一個GET_MSG_BULK請求PDU。

+0

我想,這並不能真正回答這個問題。查理正在尋找在代理方找到OID的繼任者的最佳方式。在經理方執行snmp漫遊操作時,您的答案適用。 – Jolta

+0

@Jolta當然是的。我的錯。 – initzero