4

我想通过snmp GETBULK获取路由器的接口信息,但是我使用的时候,只返回了部分记录。

代码如下:

public static void main(String[] args) throws IOException, InterruptedException {
    Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
    snmp.listen();

    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString("public"));
    target.setVersion(SnmpConstants.version2c);
    target.setAddress(new UdpAddress("127.0.0.1/161"));
    target.setTimeout(3000);    //3s
    target.setRetries(1);

    PDU pdu = new PDU();
    pdu.setType(PDU.GETBULK);
    pdu.setMaxRepetitions(200); 
    pdu.setNonRepeaters(0);
    pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.31.1.1.1.1"))); 

    ResponseEvent responseEvent = snmp.send(pdu, target);
    PDU response = responseEvent.getResponse();

    if (response == null) {
        System.out.println("TimeOut...");
    } 
    else 
    {
        if (response.getErrorStatus() == PDU.noError) 
        {
            Vector<? extends VariableBinding> vbs = response.getVariableBindings();
            for (VariableBinding vb : vbs) {
                System.out.println(vb + " ," + vb.getVariable().getSyntaxString());
            }
        } 
        else 
        {
            System.out.println("Error:" + response.getErrorStatusText());
        }
    }
}

执行后,有59条记录被返回,但如果我使用GETNEXT获取它们,大约有197条记录被返回。

有任何想法吗?

希望有人可以帮助我,在此先感谢。

4

3 回答 3

4

How big are your responses? Remember - a getbulk response has to fit in a single UDP packet. That's an absolute limit of 65,535 bytes - or if you've got MTU limitations potentially as small as 1,500 bytes.

于 2013-07-18T10:14:55.663 回答
1

这是预期的行为,并且可能由于几个原因而发生。

引用RFC 3416 §4.2.3 “GetBulkRequest-PDU”(强调我的):

[..] 接收 SNMP 实体生成一个 Response-PDU,其中包含请求通信的请求变量绑定的总数。

[..] 虽然 Response-PDU 中的最大变量绑定数以 N + (M * R) 为界,但由于以下三个原因之一,可能会使用较少数量的变量绑定(可能为零)生成响应。

  1. 如果封装包含请求的变量绑定数量的 Response-PDU 的消息的大小将大于本地约束或发起者的最大消息大小,则使用较少数量的变量绑定生成响应。这个较小的数字是变量绑定的有序集合,在集合末尾的一些变量绑定被移除,这样封装 Response-PDU 的消息的大小大约等于但不大于局部约束或发起者的最大消息大小。请注意,删除的变量绑定数与 N、M 或 R 的值无关。

  2. 如果对于迭代 i 的某个值(例如 i 大于零且小于或等于 M),所有生成的变量绑定的值字段都设置为“,则还可以使用较少数量的变量绑定生成响应endOfMibView”。在这种情况下,变量绑定可能在第 (N + (i * R)) 次变量绑定之后被截断。

  3. 如果处理具有多次重复的请求需要比正常请求显着更多的处理时间,则命令响应程序应用程序可以在少于全部重复次数的情况下终止请求,前提是至少完成了一次重复.

[..]

在您的情况下,您很可能超过了最大邮件大小。

如果你得到的对象比你想要的少,你可以从你离开的地方开始做另一个GetBulk请求。(这与您在 C 代码中处理 TCP/IP 套接字的方式相同——您必须read()依次进行,直到您拥有所需的一切。)

例如,诸如 Net-SNMP snmptable(可以指示使用GetBulk的 table walker )之类的实现将执行此操作,直到到达表的末尾。

于 2018-11-22T10:59:37.293 回答
0

我只想指出原始海报有解决方案:使用 GETNEXT 而不是 GETBULK ,您将获得所有记录。GETBULK 仅适用于您的退货尺寸在 PP 范围内。指定的。

于 2018-11-21T16:31:02.390 回答