首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GETBULK SNMP4J请求

GETBULK SNMP4J请求
EN

Stack Overflow用户
提问于 2017-05-23 18:28:57
回答 3查看 2.3K关注 0票数 2

我正在使用snmp4j尝试对一个远程代理执行SNMP功能。由于一些我们无法控制的限制,我需要执行一个GETBULK来在短时间内获得一个大表。

我目前的实现:

代码语言:javascript
运行
复制
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个条目。

EN

回答 3

Stack Overflow用户

发布于 2017-05-25 15:28:24

使用MaxRepetitions > 100是不好的做法,因为TCP/IP数据包分片和UDP的性质不能保证数据包的顺序。所以大多数SNMP框架和代理都有这样的内置限制。

票数 0
EN

Stack Overflow用户

发布于 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小节中的示例。

票数 0
EN

Stack Overflow用户

发布于 2017-05-30 01:38:23

您已将最大重复计数设置为200,即服务器最多可以向您发送200行。因此,一方面,您永远不会获得超过200行(至少5000行或更多行)。另一方面,服务器可能决定向您发送较少的行,这实际上是服务器的选择;您告诉他您能够处理的内容。

通常您最多请求10-50行。(顺便说一句,有很多服务器的SNMP实现都有缺陷,您设置的最大重复次数越高,就越有可能什么都得不到。)

因此,您必须逐行请求行集合。因为您可能不想自己实现它,所以我建议使用TableUtils类。就从getTable()开始吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44132250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档