2009-07-16 112 views
0

我需要接收和解析一些SNMP陷阱(消​​息),我希望获得我在OS X机器上工作的代码的任何建议。我已经得到了一些使用net-snmp在Windows上运行的Java代码。我想要让Java代码在我的开发机器上运行,或者掀起一些Python代码来做同样的事情。如何在OS X上接收SNMP陷阱?

我能够在我的OS X机器上编译Java代码,它运行时没有任何抱怨,包括我无法绑定到套接字8255时会引发的异常。但是,它从来没有报告收到任何SNMP陷阱,这让我怀疑它是否真的能够读取套接字。下面是我收集到从结合到插座上的Java程序代码:使用Python周围

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和喜欢乱七八糟,我通过easy_install安装libsnmp,并试图获取加工。示例程序traplistener.pytrapsender.py彼此交谈没有问题,但如果我运行traplistener.py等待自己的SNMP信号,我再次无法接收任何内容。我应该注意,我必须通过sudo运行python程序才能获得访问套接字的权限。通过sudo运行java程序没有效果。

所有这些让我怀疑这两个程序都遇到了OS X及其套接字的问题,或许他们的权限。例如,我必须更改Wireshark工作的/dev/bpf设备上的权限。另一个想法是,它与我的机器启用了多个网络适配器有关,包括eth0(以太网,我看到陷阱信息感谢Wireshark)和eth1(wifi)。这可能是问题吗?如你所见,我对socket或SNMP知之甚少,所以任何帮助都非常感谢!

更新:使用lsofsudo 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。但是,我的程序仍然没有显示接收到我知道的数据包的迹象。

回答

0

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

0

SNMP陷阱的标准端口号为162

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

+0

我不知道,虽然我被告知SNMP数据包在某种程度上是非标准的,所以这可能是其中的一部分... – pr1001 2009-07-16 16:24:57