1

特定の質問をしたいと思います: 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 にもありませんか、何か不足していますか?

私が試したこと:

  1. pcap.inject()の代わりに使用していますpcap.sendPacket()が、私の NIC はこの機能をサポートしていないようです
  2. キャプチャ方向をインバウンドのみに設定 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 番目のインターフェイスについても同様です。

よろしくお願いいたします。

4

1 に答える 1

0

これは古くてあまり人気のないトピックだと思いますが、バッファを追加して重複を常にチェックすることで、最終的にこれを解決しました。jnetpcap.comコードは複雑なので、主要な機能と、推奨事項に基づいてフレームを無視する方法を投稿することにしました。

コード:

// we're inside the nextPacket(PcapPacket currentPacket, String user) method
buffer.lock();
for(int j = 0; j<buffer.size(); j++){
    if(currentPacket.getCaptureHeader().caplen() == buffer.get(j).getCaptureHeader().caplen() 
        && packet.size() == buffer.get(j).size()){

        buffer.erasePacket(j);

        return;
    }

}
buffer.unlock();
// continue packet processing

プロジェクトで自由に使用してください。

于 2015-05-20T16:55:56.380 に答える