首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用jpcap打开设备

无法使用jpcap打开设备
EN

Stack Overflow用户
提问于 2012-12-20 22:47:15
回答 1查看 2.9K关注 0票数 1

我在使用jpcap库打开找到的网络设备时遇到问题。我已经安装了winpcap,并在system32和syswow64中安装了jpcap.dll。以下教程代码在尝试打开设备时崩溃。崩溃日志:

代码语言:javascript
复制
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

在debug中,我可以看到m_device设置为:

代码语言:javascript
复制
"\Device\NPF_{EC5226CF-3F55-4148-B40E-1FC3F8BB3398}   Realtek PCIe GBE Family Controller"

在以下代码中:

代码语言:javascript
复制
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 + ")");
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-21 03:04:15

如果您的字面意思是一个字符串,其第一个字符是“\ "\Device\NPF_{EC5226CF-3F55-4148-B40E-1FC3F8BB3398} Realtek PCIe GBE Family Controller"”中的"D“,最后一个字符是”控制器“中的"r”,则它不是有效的WinPcap设备名称字符串。

"\Device\NPF_{EC5226CF-3F55-4148-B40E-1FC3F8BB3398}"将是有效的设备名称字符串。

从Jpcap源代码可以看出,findDevice方法似乎没有返回有效的设备名称字符串。它被记录为返回“描述网络设备的字符串”;它返回的是一个包含设备名称字符串、一个换行符、两个空格和设备供应商描述字符串的字符串。This has been reported as a Jpcap bug

我建议您扫描字符串,查找第一个空白字符(“空白”包括空格和换行符),并使用设备名传递给open例程,包括但不包括该空白字符。(如果找不到空格字符,请使用整个字符串。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13974673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档