特定の質問をしたいと思います: Java 1.7でjNetPcap 1.4ライブラリを使用してソフトウェア スイッチを開発しようとしています。目標は、ポート番号で受信したパケットを転送できるプログラムを作成することです。1~ポート番号 2 およびその逆(これら 2 つの NIC-s のみ)。
両方のインターフェースですべての着信パケットを確認できますが、転送に関しては問題があります。クラス内pcap.sendPacket(PcapPacket)
のnextPacket()
関数を使用してインターフェース X でパケットを送信すると、それも認識され、"同じインスタンスPcapPacketHandler()
によって送信されたため、単に無視するのではなく、新しい" パケット。Pcap
pcap.sendPacket(PcapPacket) 関数によって送信されたパケットを無視する方法はありますか (したがって、nextPacket() 関数に再び表示されません)?
基礎となる winpcap ライブラリについてはあまり知りませんが、C# の SharpPcap にはこのタイプの機能があると確信しています。jNetPcap にもありませんか、何か不足していますか?
私が試したこと:
pcap.inject()
の代わりに使用していますpcap.sendPacket()
が、私の NIC はこの機能をサポートしていないようです- キャプチャ方向をインバウンドのみに設定
pcap.setDirection(Direction.IN)
- これはまったく効果がないようです。パケットは設定前と同じようにキャプチャされます。
Ps。残念ながら、Java で書かなければなりません。jNetPcap ライブラリにこの機能がない場合は、問題の解決方法を教えてください。送信されたパケットを何らかのタイプの配列にバッファリングし、新しく検出されたすべてのパケットが配列内の 1 つのパケットと同じであることを確認することを考えていますが、これは計算上複雑なソリューションのようです。
これが私のサンプルコードです(全体ではなく、関連する部分だけです):
// Init
Pcap pcap = Pcap.openLive(devices.get(0).getName(), 64*1024, Pcap.MODE_PROMISCUOUS, 1000, errbuf);
...
PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
public void nextPacket(PcapPacket packet, String user) {
// The duplicate packet that is sent in the sendAll() function also appears here
// Process the packet and add it to the forwarding buffer if needed
buffer.addPacket(packet);
}
}
// This is called in a separate thread, if some packets were added to the buffer
public void sendAll(){
while(buffer.hasNext() != 0){
pcap.sendPacket(buffer.getNextPacket());
}
}
2 番目のインターフェイスについても同様です。
よろしくお願いいたします。