1

我的控制台输出是——

Exception in thread "main" java.lang.IllegalArgumentException: size of array must be MAX_ID_COUNT size
at org.jnetpcap.packet.JScanner.loadScanners(Native Method)
at org.jnetpcap.packet.JScanner.reloadAll(JScanner.java:376)
at org.jnetpcap.packet.JScanner.<init>(JScanner.java:313)
at org.jnetpcap.packet.JScanner.<init>(JScanner.java:293)
at org.jnetpcap.packet.JPacket.getDefaultScanner(JPacket.java:621)
at org.jnetpcap.packet.JPacket.scan(JPacket.java:1094)
at org.jnetpcap.packet.JMemoryPacket.<init>(JMemoryPacket.java:387)
at org.jnetpcap.packet.JMemoryPacket.<init>(JMemoryPacket.java:440)
at ClassicPcapExample.main(ClassicPcapExample.java:128)

代码:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.jnetpcap.packet.JMemoryPacket;  
import org.jnetpcap.packet.JPacket;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;
import org.jnetpcap.protocol.JProtocol; 
import org.jnetpcap.protocol.lan.Ethernet;
import org.jnetpcap.protocol.network.Ip4;
import org.jnetpcap.protocol.tcpip.Tcp;

public class ClassicPcapExample{

/**
 * Main startup method
 * 
 * @param args
 *          ignored
 */
public static void main(String[] args) {
    List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with NICs
    StringBuilder errbuf = new StringBuilder(); // For any error msgs

    /***************************************************************************
     * First get a list of devices on this system
     **************************************************************************/
    int r = Pcap.findAllDevs(alldevs, errbuf);
    if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
        System.err.printf("Can't read list of devices, error is %s", errbuf
            .toString());
        return;
    }

    System.out.println("Network devices found:");

    int i = 0;
    for (PcapIf device : alldevs) {
        String description =
            (device.getDescription() != null) ? device.getDescription()
                : "No description available";
        System.out.printf("#%d: %s [%s]\n", i++, device.getName(), description);
    }

    PcapIf device = alldevs.get(0); // We know we have atleast 1 device
    System.out
        .printf("\nChoosing '%s' on your behalf:\n",
            (device.getDescription() != null) ? device.getDescription()
                : device.getName());

    /***************************************************************************
     * Second we open up the selected device
     **************************************************************************/
    int snaplen = 64 * 1024;           // Capture all packets, no truncation
    int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
    int timeout = 10 * 1000;           // 10 seconds in milliseconds
    Pcap pcap =
        Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);

    if (pcap == null) {
        System.err.printf("Error while opening device for capture: "
            + errbuf.toString());
        return;
    }

    /***************************************************************************
     * Third we create a packet handler which will receive packets from the
     * libpcap loop.
     **************************************************************************/
    PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {

        public void nextPacket(PcapPacket packet, String user) {

            System.out.printf("Received packet at %s caplen=%-4d len=%-4d %s\n",
                new Date(packet.getCaptureHeader().timestampInMillis()), 
                packet.getCaptureHeader().caplen(),  // Length actually captured
                packet.getCaptureHeader().wirelen(), // Original length 
                user                                 // User supplied object
                );
        }
    };

    /***************************************************************************
     * Fourth we enter the loop and tell it to capture 10 packets. The loop
     * method does a mapping of pcap.datalink() DLT value to JProtocol ID, which
     * is needed by JScanner. The scanner scans the packet buffer and decodes
     * the headers. The mapping is done automatically, although a variation on
     * the loop method exists that allows the programmer to specify exactly
     * which protocol ID to use as the data link type for this pcap interface.
     **************************************************************************/
    //pcap.loop(5, jpacketHandler, "jNetPcap rocks!");//GETTING AN ERROR AT THIS LINE!! 

    pcap.close();


}
}
4

1 回答 1

2

当我从 1.4.r1425 降级到 1.3 时,我开始遇到同样的问题,这是由于我忘记用 1.3 版本的 dll 替换的 1.4.r1425 版本的 jnetpcap.dll 文件造成的。我建议您确保您拥有正确版本的可用本机库文件(Windows 的 .dll/Linux 的 .so - 根据您的环境)。

于 2013-12-23T20:29:10.010 回答