1

jpcapライブラリで見つかったネットワークデバイスを開くのに問題があります。私はwinpcapをインストールし、system32とsyswow64にjpcap.dllを持っています。次のチュートリアルコードは、デバイスを開こうとするとクラッシュします。クラッシュログ:

PacketCapture: loading native library jpcap.. ok
net.sourceforge.jpcap.capture.CaptureDeviceOpenException: Error opening adapter: The system cannot find the device specified. (20)
    at net.sourceforge.jpcap.capture.PacketCapture.open(Native Method)
    at net.sourceforge.jpcap.capture.PacketCapture.open(PacketCapture.java:57)
    at networksnifferdesktop.NetworkSnifferDesktop.<init>(NetworkSnifferDesktop.java:26)
    at networksnifferdesktop.NetworkSnifferDesktop.main(NetworkSnifferDesktop.java:40)
Java Result: 1

m_deviceデバッグでは、次のように設定されていることがわかります。

"\Device\NPF_{EC5226CF-3F55-4148-B40E-1FC3F8BB3398}   Realtek PCIe GBE Family Controller"

次のコードで:

package networksnifferdesktop;

import net.sourceforge.jpcap.capture.*;
import net.sourceforge.jpcap.net.*;

public class NetworkSnifferDesktop
{
    private static final int INFINITE = -1;
    private static final int PACKET_COUNT = 10;

    // BPF filter for capturing any packet
    private static final String FILTER = "";

    private PacketCapture m_pcap;
    private String m_device;

    public NetworkSnifferDesktop() throws Exception
    {
        // Step 1:  Instantiate Capturing Engine
        m_pcap = new PacketCapture();

        // Step 2:  Check for devices
        m_device = m_pcap.findDevice();

        // Step 3:  Open Device for Capturing (requires root)
        m_pcap.open(m_device, true);

        // Step 4:  Add a BPF Filter (see tcpdump documentation)
        m_pcap.setFilter(FILTER, true);

        // Step 5:  Register a Listener for Raw Packets
        m_pcap.addRawPacketListener(new RawPacketHandler());

        // Step 6:  Capture Data (max. PACKET_COUNT packets)
        m_pcap.capture(PACKET_COUNT);
    }

    public static void main(String[] args)
    {
        try
        {
            NetworkSnifferDesktop example = new NetworkSnifferDesktop();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

class RawPacketHandler implements RawPacketListener
{
    private static int m_counter = 0;

    public void rawPacketArrived(RawPacket data)
    {
        m_counter++;
        System.out.println("Received packet (" + m_counter + ")");
    }
}
4

1 に答える 1

3

"\Device\NPF_{EC5226CF-3F55-4148-B40E-1FC3F8BB3398} Realtek PCIe GBE Family Controller"、最初の文字が「\Device」の「D」で、最後の文字が「Controller」の「r」である文字列を文字通り意味する場合、有効な WinPcap デバイス名文字列ではありません。

"\Device\NPF_{EC5226CF-3F55-4148-B40E-1FC3F8BB3398}"有効なデバイス名文字列になります。

Jpcap ソースを見ると、このfindDeviceメソッドは有効なデバイス名文字列を返していないようです。「ネットワークデバイスを説明する文字列」を返すと文書化されています。返されるのは、デバイス名の文字列、改行、2 つの空白、およびデバイスのベンダーの説明文字列を含む文字列です。 これは Jpcap のバグとして報告されています。

文字列をスキャンして最初の空白文字 (「空白」には空白と改行が含まれます) を探し、open ルーチンに渡すデバイス名として、その空白までのすべてを使用することをお勧めします。 -スペース文字。(空白文字が見つからない場合は、文字列全体を使用してください。)

于 2012-12-20T19:04:15.213 に答える