いくつかの 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
とtrapsender.py
は互いに通信するのに問題はありませんがtraplistener.py
、自分自身の SNMP 信号を待って実行すると、何も受信できません。sudo
ソケットへのアクセス許可を得るには、python プログラムを実行する必要があったことに注意してください。sudo 経由で Java プログラムを実行しても効果はありませんでした。
これらすべてのことから、両方のプログラムが OS X とそのソケット、おそらくそれらのパーミッションに問題を抱えていると思われます。たとえば、/dev/bpf
Wireshark を機能させるには、デバイスのアクセス許可を変更する必要がありました。もう 1 つの考えは、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: OK、Java パラメータの順序が間違っていたと思います:java -Djava.net.preferIPv4Stack=true -jar bridge.jar
プログラムを IPv4 に配置します。ただし、私のプログラムは、そこにあることがわかっているパケットを受信する兆候をまだ示していません。