2013-10-11 2 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.3 버전 dll로 교체하는 것을 잊어 버린 1.4.r1425 버전 jnetpcap.dll 파일 때문이었습니다. 나는 네가 네이티브 라이브러리 파일 (윈도우 환경에서는 .dll, Linux 환경에서는 .so)을 올바른 버전으로 가지고 있는지 확인하도록 권한다.

+0

저를 위해 일한 thx! –