2013-07-01 45 views
0

JNetPcap有一些問題。eclipse中的JNetPcap不會打印錯誤... Ubuntu 12.04

我使用Ubuntu 12.04,並試圖製作基於java語言的數據包snipper。

我所做的是以下。

  1. 我已經下載了JNetPcap 1.3.0。

  2. 並且正如教程所說的構建了一個java項目。 http://jnetpcap.com/examples/dumper < - 這是鏈接。

  3. 我輸入就像那個鏈接,我得到了我的第一個問題。 PcapHandler類已被棄用。所以我找到了文檔,並用ByteBufferHandler替換它。

  4. 現在我編譯這個項目,並得到一個unsatifiedLinked錯誤。 我已經嘗試用靜態塊來加載該庫。 經過一番嘗試,我將「libjnetpcap.so」複製到/ usr/lib/

  5. 現在我刪除了不滿意的鏈接錯誤。但不知何故它停止在第一次錯誤檢查。 它打印「第一個錯誤檢查:」,然後自動退出。

    公共靜態無效的主要(字串[] args){

    List<PcapIf> alldevs = new ArrayList<PcapIf>(); 
    StringBuilder errbuff = new StringBuilder(); 
    
    int r = Pcap.findAllDevs(alldevs, errbuff); 
    
    //============1st check 
    if(r == Pcap.NOT_OK || alldevs.isEmpty()){ 
        System.err.printf("1st error check : %s\n", errbuff.toString()); 
        return; 
    } 
    PcapIf device = alldevs.get(1); 
    //===================== END 
    
    int snaplen = 64 * 1024; 
    int flags = Pcap.MODE_PROMISCUOUS; 
    int timeout = 10 * 1000; 
    Pcap pcap = Pcap.openLive(device.getName(),snaplen, flags, timeout, errbuff); 
    
    //============2nd check 
    if(pcap == null){ 
        System.err.printf("2nd error check : %s\n", errbuff.toString()); 
        return;   
    } 
    //===================== END 
    
    String ofile = "/home/juneyoungoh/tmp_capture_file.cap"; 
    final PcapDumper dumper = pcap.dumpOpen(ofile); 
    
    ByteBufferHandler<PcapDumper> handler = new ByteBufferHandler<PcapDumper>() { 
    
        @Override 
        public void nextPacket(PcapHeader arg0, ByteBuffer arg1, PcapDumper arg2) { 
         dumper.dump(arg0, arg1); 
    
        } 
    }; 
    
    pcap.loop(10,handler, dumper); 
    
    File file = new File(ofile); 
    System.out.printf("%s file has %d bytes in it!\n", ofile, file.length()); 
    
    dumper.close(); 
    pcap.close(); 
    
    if(file.exists()){ 
        file.delete(); 
    } 
    

    }

如果有任何好的參考或絕妙的主意,請分享。

謝謝。

回答

0

在Linux上,計劃可能要以root身份運行,或以其他方式給予足夠的權限,以便能夠打開任何設備,並且,目前,pcap_findalldevs(),這大概是什麼Pcap.findAllDevs方法使用,試圖打開找到的每個設備,並只返回它可以打開的設備。

所以你必須以root身份運行你的Java程序,或者必須安排它有足夠的權限(CAP_NET_RAW和CAP_NET_ADMIN)來獲取網絡適配器列表並打開這些適配器。

+0

但是,當我打印findAllDevs的結果時,它表示成功爲0。根據回報值,它應該工作。 –

+0

請注意,對於'pcap_findalldevs()',「working」包括「不返回任何設備」。 ''Pcap.findAllDevs()'可能是'pcap_findalldevs()'的一個簡單包裝,並且可能工作原理相同。 (如果問題在於我說的是,它可能是,你將需要''Pcap.openLive()'調用的特權,所以我***強烈建議你運行你的程序如果您想捕獲流量,請使用這些權限。) – 2013-07-02 02:23:52

+0

Yeap。你是對的。我剛剛在官方的JNetPcap主頁上發現了你在這裏寫的東西。 http://jnetpcap.com/node/184它寫在2009年,但stil有我想這個問題。所以我實際上做的是在eclipse中以root權限運行這個程序,對吧? –