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:\Windows\System32 下就行。
(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使用文檔的下載鏈接,有興趣的話最好還是照着使用文檔來使用。
上面有什么錯誤還希望大家指正,希望能和大家多交流。
本文系原創,轉載還請注明出處。