生のネットワーク パケットを送受信できる最も簡単な方法は何でしょうか。c API の独自の JNI ラッピングを作成する必要がありますか? その場合、どの API を探していますか?
編集: Wireshark が行うこと、つまり、インターフェイス上のすべての着信パケットを記録し、さらに自分で作成したパケットを送り返すことができるようにしたいと考えています。そして、私はそれをMacでやりたいです。
生のネットワーク パケットを送受信できる最も簡単な方法は何でしょうか。c API の独自の JNI ラッピングを作成する必要がありますか? その場合、どの API を探していますか?
編集: Wireshark が行うこと、つまり、インターフェイス上のすべての着信パケットを記録し、さらに自分で作成したパケットを送り返すことができるようにしたいと考えています。そして、私はそれをMacでやりたいです。
パケットスニファのようなものが必要であるという考えから始める場合は、 http://netresearch.ics.uci.edu/kfujii/jpcap/doc/を参照してください。
Raw Socket for Java は、長い間 JDK に要求されていました。こちらのリクエストをご覧ください。回避策と解決策を探すことができる長い議論があります。単純な PING 操作でこれが必要だったことがありますが、これをどのように解決したか思い出せません。ごめん :)
これまでの私の最善の策は、BPF api であり、薄い JNI ラッパーを作成することです。
ピュア Java から生のソケットにアクセスすることはできないため、Java コードとネットワーク インターフェイスの間に何らかのレイヤーが必要になります。
また、raw ソケットへのアクセスは、通常、「ルート」プロセスのみが利用できることに注意してください。そうしないと、ユーザーは、a) すべてのトラフィックを盗聴し、b) なりすましパケットを生成することができるからです。
「ルート」として実行する必要があるようにプログラム全体を作成するのではなく、パケットのキャプチャと生成を、ある種の IPC (RMI、名前付きパイプ、TCP ソケットなど) を使用してスタンドアロン プログラムで実行し、 Java アプリでデータを取得します。
TINIは Java イーサネット コントローラであり、イーサネット フレームから TCP ストリームへのデータに直接アクセスするためのライブラリとクラスを備えている場合があります。必要なクラスを実装するものを見つけることができるかもしれません。そうでない場合は、有利なスタートを切るためのポインターまたはユーザー グループが必要です。