2

我正在尝试编写一个 SNMP 代理,坦率地说,整个过程就像阅读翻译不佳的立体声指令。但我很接近,除了一个问题:实现 GETNEXT 操作。

考虑以下系统 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 通过首先在 .1.8.0 上执行 GET,然后执行 GETNEXT 来实现这一点。GETNEXT 应该从 .1.8.0 到 .1.9.1.2.1,然后是 .1.9.1.2.2,依此类推。

我认识到这在概念上只是深度优先行走,但由于某种原因——也许是年龄——当它必须找到 GET 节点然后备份时,我无法找到一种干净的方式来实现该搜索下一次调用并找到“下一个”节点。

随意向我展示它非常简单。

更新

我在 26 小时的编程回合后写了这篇文章,所以我可以想象它并不清楚。这是问题:

我需要一个函数后继者,它以 OID 作为输入并返回下一个 OID——其中 next 是 SNMP 工具实现的深度优先顺序。我有几个解决方案,通过以深度优先顺序枚举 OID 并等待正确的出现,; 我正在寻找一个比 O(l+n) 更好的优雅的,其中 l 是 OID 的长度,n 是 OID 的数量。

4

1 回答 1

-1

根据您正在行走的根 OID 检查响应 PDU 中的每个 OID。如果找到匹配项,那么您就知道停止遍历树。如果找不到匹配项,则发送下一个 GET_MSG_BULK 请求 PDU。

于 2013-06-07T11:54:56.590 回答