0

JNetPcap 有一些问题。

我使用 Ubuntu 12.04,并尝试制作基于 java 语言的数据包截断器。

我所做的如下。

  1. 我已经下载了 JNetPcap 1.3.0。

  2. 正如教程所说,建立了一个java项目。 http://jnetpcap.com/examples/dumper <- 这是链接。

  3. 我就像那个链接一样输入,我遇到了第一个问题。PcapHandler 类已弃用。所以我找到了文档并用 ByteBufferHandler 替换它。

  4. 现在我编译这个项目并得到一个 unsatifiedLinked 错误。我已经尝试使用静态块来加载该库。经过一些尝试,我将“libjnetpcap.so”复制到 /usr/lib/

  5. 现在我删除了 unsatisfiedLinked 错误。但不知何故,它在第一次错误检查中停止了。它打印“第一次错误检查:”,然后自动退出。

    公共静态无效主要(字符串[]参数){

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

    }

如果有什么好的参考或好主意,请分享。

谢谢。

4

1 回答 1

0

在 Linux 上,一个程序可能必须以 root 身份运行,或者以其他方式授予足够的权限,以便能够打开任何设备,并且目前,pcap_findalldevs()这可能是该Pcap.findAllDevs方法使用的,尝试打开每个它找到的设备,并且只返回它可以打开的设备。

因此,您必须以 root 身份运行您的 Java 程序,或者必须以某种方式安排它具有足够的权限(CAP_NET_RAW 和 CAP_NET_ADMIN)来获取网络适配器列表并打开这些适配器。

于 2013-07-01T17:09:15.947 回答