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

我处理接收snmp陷阱的服务器。一切进展顺利。现在,我需要更改陷阱来通知。
问题是我的服务器尝试两次处理收到的消息。我发生了与INFORM消息重复的情况。

尝试说明...我已启用记录仪到调试级别。
到达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版本2.3.0

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

最佳答案

接收者必须确认INFORM。

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

10-08 01:54