通过接收器正确处理snmp INFORM

时间:2015-04-21 13:19:37

标签: java snmp snmp4j

我有一些SNMP4J的特殊行为,我无法解释。这很可能是由于我对snmp基础知识的误解。

我处理接收snmp陷阱的服务器。一切都很顺利。现在我需要更改陷阱来通知。 问题是我的服务器试图处理收到的消息两次。我发现了重复的INFORM消息。

试图解释......我已经将记录器启用到DEBUG级别。 当INFORM到达时,我在日志文件中看到来自 org.snmp4j.transport.DefaultUdpTransportMapping.ListenThread 类的两个相同记录,其中包含 run()方法中的以下代码:

if (logger.isDebugEnabled()) {
    logger.debug("Received message from "+packet.getAddress()+"/"+
            packet.getPort()+
            " with length "+packet.getLength()+": "+
            new OctetString(packet.getData(), 0,
            packet.getLength()).toHexString());
}

此外,我还有一个实现接口 org.snmp4j.CommandResponder 的类。他的方法 void processPdu(CommandResponderEvent event)被调用两次以获取通知,一次调用一个陷阱。

@Override
public void processPdu(final CommandResponderEvent evt) {
    final Address address = getAgentAddress(evt);
    final PDU command = evt.getPDU();
    boolean isInform = command.getType() == PDU.INFORM // this is true for both invocations of this method while receiving INFORM
}

有关版本的详细信息: snmp v2,snmp4j version 2.3.0

帮助我意识到:这里存在一些错误我应该通过command.getRequestID()来过滤 processPdu 方法的第二次调用,例如?

1 个答案:

答案 0 :(得分:3)

接收方必须确认INFORM。

我认为问题在于,由于某种原因,发件人尚未收到此 INFORM REQUEST RESPONSE PDU 。因此它会根据重试次数再次发送。确保将 RESPONSE PDU 发送给发件人以确认您已收到请求PDU(INFORM)。 API应该为您执行此操作。因此,请确保调用默认处理程序。