Мне нужно получить и проанализировать некоторые SNMP-ловушки (сообщения), и я был бы признателен за любые советы по получению кода, который у меня работает на моей машине с OS X. Мне дали немного кода Java, который работает на Windows с net-snmp. Я хотел бы либо запустить Java-код на моей машине для разработки, либо добавить немного кода Python, чтобы сделать то же самое.
Мне удалось получить код Java для компиляции на моей машине с OS X, и он работает без каких-либо жалоб, включая ни одно из исключений, которые я бы ожидал, если бы он не смог привязаться к сокету 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
и trapsender.py
без проблем общаются друг с другом, но если я запускаю traplistener.py
в ожидании своих собственных сигналов SNMP, я снова ничего не получаю. Я должен отметить, что мне пришлось запускать программы на Python через sudo
, чтобы получить разрешение на доступ к сокетам. Запуск java-программы через sudo не дал результатов.
Все это заставляет меня подозревать, что обе программы имеют проблемы с OS X и ее сокетами, возможно, с их разрешениями. Например, мне пришлось изменить разрешения на устройствах /dev/bpf
, чтобы Wireshark работал. Другая мысль заключается в том, что это как-то связано с тем, что на моей машине включено несколько сетевых адаптеров, включая eth0 (ethernet, где я вижу сообщения о ловушке благодаря Wireshark) и eth1 (wifi). Может ли это быть проблемой?
Как видите, я очень мало знаю о сокетах или SNMP, поэтому любая помощь очень ценится!
Обновление: При использовании lsof
(точнее sudo lsof -i -n -P
) моя проблема заключается в том, что java-программа прослушивает IPv6 только тогда, когда отправитель ловушек использует IPv4. Я пытался отключить 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. Тем не менее, моя программа все еще не показывает никаких признаков получения пакетов, которые, как я знаю, есть.