2013-10-11 88 views
1

我的控制台输出 -jnetpcap获取java.lang.IllegalArgumentException异常

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(); 


} 
} 

回答

2

我开始了同样的问题,当我从1.4.r1425,降级到1.3,其我是由于1.4.r1425版本的jnetpcap.dll文件,我忘记了用1.3版本的dll替换。我建议你确保你有本地库文件的正确版本(.dll for windows/.so for linux -as per ur environment)。

+0

thx为我工作! –

相关问题