我需要接收和解析一些 SNMP 陷阱(消息),我将不胜感激有关获取我在我的 OS X 机器上工作的代码的任何建议。我得到了一些使用 net-snmp 在 Windows 上运行的 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,因此我通过安装libsnmp并easy_install
尝试使其正常工作。示例程序彼此交谈没有问题,但如果我运行traplistener.py
等待自己的 SNMP 信号,我再次无法接收任何内容。我应该注意,我必须通过运行 python 程序才能获得访问套接字的权限。通过 sudo 运行 java 程序没有任何效果。trapsender.py
traplistener.py
sudo
所有这一切让我怀疑这两个程序都存在 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 上。但是,我的程序仍然没有显示接收到我知道的数据包的迹象。