如何在OS X上接收SNMP陷阱?

时间:2009-07-16 07:36:59

标签: java python macos sockets snmp

我需要接收和解析一些SNMP陷阱(消​​息),我很感激有关获取我在OS X机器上工作的代码的任何建议。我已经获得了一些在Windows上使用net-snmp运行的Java代码。我想要在我的开发机器上运行Java代码,或者编写一些Python代码来执行相同的操作。

我能够在我的OS X机器上编译Java代码并且它运行时没有任何抱怨,包括如果它无法绑定到套接字8255,我会期望抛出的异常。但是,它从不报告接收任何SNMP陷阱,这让我想知道它是否真的能够读取套接字。以下是我收集的Java程序中绑定到套接字的代码:

DatagramChannel dgChannel1=DatagramChannel.open();
Selector mux=Selector.open();
dgChannel1.socket().bind(new InetSocketAddress(8255));
dgChannel1.configureBlocking(false);
dgChannel1.register(mux,SelectionKey.OP_READ);
while(mux.select()>0) {
    Iterator keyIt = mux.selectedKeys().iterator();
    while (keyIt.hasNext()) {
        SelectionKey key = (SelectionKey) keyIt.next();
        if (key.isReadable()) {
            /* processing */
        }
    }
}

由于我不了解Java并喜欢乱用Python,我通过easy_install安装了libsnmp并试图让它正常工作。示例程序traplistener.pytrapsender.py没有问题,但如果我运行traplistener.py等待我自己的SNMP信号,我再次无法收到任何信息。我应该注意,我必须通过sudo运行python程序才能获得访问套接字的权限。通过sudo运行java程序没有任何效果。

所有这些让我怀疑这两个程序都存在OS X及其套接字问题,也许是他们的权限。例如,我必须更改/dev/bpf设备上的权限才能使Wireshark正常工作。另一个想法是它与我的启用了多个网络适配器的机器有关,包括eth0(以太网,我在Wireshark看到了陷阱消息)和eth1(wifi)。这可能是问题吗?

正如您所看到的,我对套接字或SNMP知之甚少,所以非常感谢任何帮助!

更新:使用lsof(确切地说sudo lsof -i -n -P)似乎我的问题是,当陷阱发件人使用IPv4时,java程序仅侦听IPv6 。我已经尝试禁用IPv6(sudo ip6 -x)并告诉java使用IPv4(java -jar bridge.jar -Djava.net.preferIPv4Stack=true),但我一直在使用IPv6查找我的程序。有什么想法吗?

java      16444          peter   34u  IPv6 0x12f3ad98      0t0    UDP *:8255

更新2:好的,我猜我的java参数顺序错误:java -Djava.net.preferIPv4Stack=true -jar bridge.jar将程序置于IPv4上。但是,我的程序仍然没有显示收到我知道的数据包的迹象。

2 个答案:

答案 0 :(得分:0)

SNMP陷阱的标准端口号为162.

您是否有指定其他端口号的原因?您通常可以更改发送/接收陷阱的端口号,但显然两端必须同意。所以我想知道这是不是你的问题。

答案 1 :(得分:0)

好的,让我的代码工作的解决方案是以java -Djava.net.preferIPv4Stack=true -jar bridge.jar运行程序并重启SNMP陷阱发送器。谢谢你的帮助,Brian。