java - 接收器正确处理 snmp INFORM

标签 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());
}

我还有实现接口(interface) 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 REQUESTRESPONSE PDU。所以它根据重试次数重新发送一次。请务必向发件人发送 RESPONSE PDU 以确认您已收到 REQUEST PDU (INFORM)。 API 应该会为您完成。因此,请务必调用默认处理程序。

关于java - 接收器正确处理 snmp INFORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29773389/

相关文章:

snmp - SNMPv2c 读写团体允许的最大长度

java - 是否可以将匿名类从 Java 转换为 JRuby?

java - AuthPriv 未处理的 SNMP4J V3 陷阱

java - SNMP4J 如何模拟 GETBULK 请求?

java - 使用 CATALINA_OPTS 添加到 Tomcat 类路径

java - 使用 BufferedReader 按任意键

java - Big Word 应用程序,使用 Canvas Javafx,有趣的挑战

java - Oracle JPA GenerationType.AUTO 与生成器要求 "hibernate_sequence"

ssh - DD WRT-是否有任何选项(SNMP/CLI)在不使用Web界面的情况下获取路由器的温度?

python - 用于 python 3 的 Centos 7 和 netsnmp