我正在使用snmp4j尝试对一个远程代理执行SNMP功能。由于一些我们无法控制的限制,我需要执行一个GETBULK
来在短时间内获得一个大表。
我目前的实现:
public Map<String, String> doGetBulk(@NotNull VariableBinding... vbs)
throws IOException {
Map<String, String> result = new HashMap<>();
Snmp snmp = null;
try {
// Create TransportMapping and Listen
TransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
PDU pdu = new PDU();
pdu.setType(PDU.GETBULK);
pdu.setMaxRepetitions(200);
pdu.setNonRepeaters(0);
pdu.addAll(vbs);
ResponseEvent responseEvent = snmp.send(pdu, this.target);
PDU response = responseEvent.getResponse();
// Process Agent Response
if (response != null) {
for(VariableBinding vb : response.getVariableBindings()) {
result.put("." + vb.getOid().toString(), vb.getVariable().toString());
}
} else {
LOG.error("Error: Agent Timeout... ");
}
} catch (NullPointerException ignore) {
// The variable table is null
} finally {
if (snmp != null) snmp.close();
}
return result;
}
然而,当我知道有5000+时,这只会返回100个结果。我知道我不能超过PDU的大小,所以我对响应被截断成100个块有很大的问题,但我不知道如何才能获得一个句柄来级联请求以获得下一个100个条目。
发布于 2017-05-25 15:28:24
使用MaxRepetitions > 100是不好的做法,因为TCP/IP数据包分片和UDP的性质不能保证数据包的顺序。所以大多数SNMP框架和代理都有这样的内置限制。
发布于 2017-05-30 01:08:36
所有细节都已经在RFC文档中了,
https://www.rfc-editor.org/rfc/rfc1905
4.2.3告诉代理端应该如何处理GET批量请求,以及
,而Response-PDU中的最大变量绑定数为
以N+ (M * R)为界,可以用较小的
三个变量中任意一个的变量绑定数(可能为零
原因。
(1)如果封装包含所请求数量的变量绑定的Response-PDU的消息的大小将大于本地约束或发起者的最大消息大小,则生成具有较少数量的变量绑定的响应。该较小的数量是变量绑定的有序集合,其中删除了集合末尾的一些变量绑定,使得封装响应PDU的消息的大小近似等于但不大于发起者的本地约束或最大消息大小。请注意,删除的变量绑定的数量与N、M或R的值没有关系。
(2)如果对于迭代i的某个值,使得i大于零且小于或等于M,使得所有生成的变量绑定的值字段都被设置为‘`endOfMibView’,则也可以用较少数量的变量绑定来生成响应。在这种情况下,可以在(N + (i * R))-th变量绑定之后截断变量绑定。
(3)如果处理具有多次重复的请求所需的处理时间比正常请求多得多,则代理可以在少于全部重复次数的情况下终止该请求,前提是至少完成了一次重复。
关于如何进行一系列正确的GET BULK操作来查询您想要的所有数据,可以参考4.2.3.1小节中的示例。
发布于 2017-05-30 01:38:23
您已将最大重复计数设置为200,即服务器最多可以向您发送200行。因此,一方面,您永远不会获得超过200行(至少5000行或更多行)。另一方面,服务器可能决定向您发送较少的行,这实际上是服务器的选择;您告诉他您能够处理的内容。
通常您最多请求10-50行。(顺便说一句,有很多服务器的SNMP实现都有缺陷,您设置的最大重复次数越高,就越有可能什么都得不到。)
因此,您必须逐行请求行集合。因为您可能不想自己实现它,所以我建议使用TableUtils
类。就从getTable()
开始吧。
https://stackoverflow.com/questions/44132250
复制相似问题