首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SNMP GETBULK问题:只能获取部件记录(如59条记录,但超过100条记录)

SNMP GETBULK问题:只能获取部件记录(如59条记录,但超过100条记录)
EN

Stack Overflow用户
提问于 2013-07-18 17:20:41
回答 3查看 5.3K关注 0票数 4

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

代码如下:

代码语言:javascript
复制
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条记录。

有什么想法吗?

希望任何人能帮助我,提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-18 18:14:56

你的回复有多大?请记住- getbulk响应必须适合单个UDP数据包。这是65,535字节的绝对限制-或者如果你的MTU限制可能小到1,500字节。

票数 4
EN

Stack Overflow用户

发布于 2018-11-22 18:59:37

这是意料之中的行为,可能会因为几个原因而发生。

引用RFC 3416 §4.2.3 "The GetBulkRequest-PDU" (重点是我的):

..接收SNMP实体产生具有的Response-PDU,直到由请求传送的所请求的变量绑定的总数。

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

  1. 如果封装包含所请求数量的变量绑定的Response-PDU的消息大小大于本地约束或发起者的最大消息大小,则使用较少数量的变量绑定生成响应。该较小的数量是变量绑定的有序集合,其中删除了集合末尾的一些变量绑定,使得封装响应PDU的消息的大小近似等于但不大于发起者的本地约束或最大消息大小。请注意,删除的变量绑定的数量与N、M或R的值无关。

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

  1. 如果处理具有多次重复的请求所需的处理时间比正常请求长得多,则命令响应器应用程序可能会在少于完整重复次数的情况下终止请求,前提是至少完成了一次重复。

。。

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

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

例如,Net-SNMP的snmptable (可以指示使用GetBulk的查询器)等实现将一直执行此操作,直到到达表的末尾。

票数 1
EN

Stack Overflow用户

发布于 2018-11-22 00:31:02

我只想指出,最初的帖子有一个解决方案:使用GETNEXT而不是GETBULK,您将获得所有记录。GETBULK仅在您的回报在PP大小范围内时才适用。已指定。

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

https://stackoverflow.com/questions/17719404

复制
相关文章

相似问题

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