Jnetpcap简述

Jnetpcap简述

最近需要做一个本地网络流量分析的项目,基于 Java 语言,上网查了很多资料,最后利用 Jnetpcap 实现了,这里做个记录。

这里先列一下我用到的工具以及版本:

     Eclipse                    Version: 2019-06 (4.12.0)

     JDK                        Version:12.0.1,2019-04-16

     WinPcap                  Version:4.1.3

     JnetPcap                 Version:1.4.r1425

Java本身不支持底层的网络操作,需要第三方包利用 JNI 封装不同系统的C库来提供 Java 上层接口,其他的一些类库像JPcap都年久失修了,我这里就是用 Jnetpcap 实现的。下面是步骤,需要用到的文件我这里附上链接:

    WinPcap:https://pan.baidu.com/s/1Xu-HAaGSkOR-WriJM4wrBw,提取码:yti0

    JnetPcap:https://pan.baidu.com/s/16bfUf8jHIH7osmC7rd0i-w      ,提取码:6pcx

JnetPcap开发者文档:https://pan.baidu.com/s/1O1GDTpTHmtHxMZXo3YXMdQ,提取码:mg2y

一、安装WInPcap(Windows系统)

使用JnetPcap都要在系统中安装WinPcap,这里是Windows系统下,Linux下需要就安装Lipcap,这里我主要以 Windows 系统来介绍。

WinPcap安装包上面已经给出,直接下了安装就行。

二、安装JnetPcap

这里使用Jnetpcap我是导入 Jar 包的形式,没有采用 Maven ,我在添加依赖之后始终显示在中央仓无法下载,不知道是哪里出了问题,后来干脆就采用麻烦一点的手段,导入 Jar 包,这里步骤就比较麻烦了。

先把上面链接的JnetPcap下载下来并解压,接下来进行下面两步:

     (1)、添加 .dll 文件进系统路径 

        这里需要把 jnetpcap.dll jnetpcap.dll 添加进系统路径中,这里添加进系统本身的路径或者 JDK/bin 路径下都可以,这里为了方便,直接把这两个文件复制到  C:WindowsSystem32 下就行。

     (2)、在项目中导入 Jar 包

       在 Eclipse 里点击 File-->New-->Folder ,名称填 lib ,再把上面解压后文件中的 jnetpcap.jar 文件复制到刚刚创建的文件夹下。

       接下来还有一步,右键点击项目,点击最下面的 Properties,选中 Java Build Path-->Libraries,注意要点击 Classpath,不要管上面那个 Modulepath ,要是添加成上面那个运行的时候会一直报 java.lang.NoClassDefFoundError。

       点击Classpath后点击右边的 Add JARS ,在里面找到刚刚的 lib 文件夹下的 jnetpcap.jar 点击添加就行,成功后应该是下面这样的。

 这样基本JnetPcap的配置就基本成功了。

 三、简单的使用

 这里我给出几个使用 JnetPcap 的例子。

获取设备网卡:

    //此方法用于获取设备上的网卡设施
    public static ArrayList<PcapIf> CaptureNet(){
        CaptureUtil.flag=false;
        
        // 用于存储搜索到的网卡
        ArrayList<PcapIf> alldevs = new ArrayList<PcapIf>(); 
        
        //取得设备列表
        int r = Pcap.findAllDevs(alldevs, errbuf);
        if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
            JOptionPane.showMessageDialog(null,errbuf.toString(),"错误",JOptionPane.ERROR_MESSAGE); 
            return null;
           }
        return alldevs;
    }

 打开选中网卡并捕获数据包:

        //打开选中的设备
        int snaplen = Pcap.DEFAULT_SNAPLEN; // 默认长度为65535
        int flags = Pcap.MODE_PROMISCUOUS;  // 混杂模式,捕获所有类型的包
        int timeout = 5 * 1000;             // 5 seconds in millis
        Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);
        if (pcap == null) {
            JOptionPane.showMessageDialog(null,errbuf.toString(),"错误",JOptionPane.ERROR_MESSAGE);
            return;
        }

开始监听:

pcap.loop(int cnt, JPacketHandler<T> handler, T user)

当然上面只是一些代码示例,不是完整的代码,在之后的博客中会更新完整的代码。

上面给出了JnetPcap使用文档的下载链接,有兴趣的话最好还是照着使用文档来使用。

上面有什么错误还希望大家指正,希望能和大家多交流。

本文系原创,转载还请注明出处。

原文地址:https://www.cnblogs.com/hzauxx/p/11128747.html