我正在尝试编写一个 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 的数量。