我需要接收和解析一些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.py
和trapsender.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上。但是,我的程序仍然没有显示收到我知道的数据包的迹象。
答案 0 :(得分:0)
SNMP陷阱的标准端口号为162.
您是否有指定其他端口号的原因?您通常可以更改发送/接收陷阱的端口号,但显然两端必须同意。所以我想知道这是不是你的问题。
答案 1 :(得分:0)
好的,让我的代码工作的解决方案是以java -Djava.net.preferIPv4Stack=true -jar bridge.jar
运行程序并重启SNMP陷阱发送器。谢谢你的帮助,Brian。