我想通过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条记录。
有什么想法吗?
希望任何人能帮助我,提前谢谢。
发布于 2013-07-18 18:14:56
你的回复有多大?请记住- getbulk响应必须适合单个UDP数据包。这是65,535字节的绝对限制-或者如果你的MTU限制可能小到1,500字节。
发布于 2018-11-22 18:59:37
这是意料之中的行为,可能会因为几个原因而发生。
引用RFC 3416 §4.2.3 "The GetBulkRequest-PDU" (重点是我的):
..接收SNMP实体产生具有的Response-PDU,直到由请求传送的所请求的变量绑定的总数。
。。虽然Response-PDU中变量绑定的最大数量由N+ (M * R)限制,但由于以下三种原因之一,可以使用较少数量的变量绑定(可能为零)生成响应。
。。
在您的情况下,您很可能超过了最大消息大小。
如果你得到的对象比你想要的少,你可以从你停止的地方开始做另一个GetBulk请求。(这与您在C代码中处理TCP/IP套接字的方式相同-您必须轮流保持read(),直到您拥有所需的一切。)
例如,Net-SNMP的snmptable (可以指示使用GetBulk的查询器)等实现将一直执行此操作,直到到达表的末尾。
发布于 2018-11-22 00:31:02
我只想指出,最初的帖子有一个解决方案:使用GETNEXT而不是GETBULK,您将获得所有记录。GETBULK仅在您的回报在PP大小范围内时才适用。已指定。
https://stackoverflow.com/questions/17719404
复制相似问题