使用Jcap捕獲資料報

2021-08-21 08:23:12 字數 2003 閱讀 2299

使用jpcap可以發包,使用jnetpcap可以接收和過濾包。現在專案中遇到的問題總結如下。

如果是在window下則必須在path路徑下存在jnetpcap.dll和jpcap.dll檔案,如果是在linux環境下,可以將jnetpcap.so和jnetpcap.so存放到/usr/lib目錄下即可,但是最好的解決方案是講將兩個so檔案存放到專案目錄下,然後使用

system.load(system.getproperty(「user.dir」)+/so檔案相對路徑)。

解決方案:直接使用網絡卡名稱開啟網絡卡   

pcap pcap=pcap.openlive("eth0",64*1024,pcap.mode_non_promiscuous,new stringbuilder()); 

//pcap pcap=pcap.openlive(網絡卡名稱,包大小,網絡卡模式,錯誤資訊); 

說明:網絡卡名稱一般為eth0等

包大小一般為64*1024

網絡卡模式一般為pcap.mode_non_promiscuous混合模式

錯誤資訊其中存放的是當網絡卡開啟失敗後返回的系統資訊,一般為stringbuilder

通過上面得到的pcap網絡卡物件就可以迴圈捕包了,大致程式邏輯如下:

由於會一台機器上可能會有多個網絡卡,所以抓包前應先進行網絡卡的繫結

pcap pcap=pcap.openlive("eth0",64*1024,pcap.mode_non_promiscuous,new stringbuilder());
pcapbpfprogram  filter = new pcapbpfprogram(); 

string expression=」 」;

int r=pcap.compile(filter , expression , 0, 0);

if(r==pcap.ok)

@override

//oripcaket為在網絡卡上根據filter捕獲的包

//具體的業務邏輯在這裡新增

}}pcap.loo(-1,handler,」可以隨便起個名字」);//第乙個引數指示接收的包數,如果為-1則表示一直接收,10則表示收取10個包後就不再收包了。

特別說明:

1.     表示式expression的重要性,因為同一時刻網絡卡有可能會收到大量的包,如果不加上過濾器那麼程式的處理能力肯定是達不到的。

2.     過濾表示式示例:

string  expression="ip   and  udp src port  12345 and dst port  54321  and eth  src  not 11:22:33:44:55:66";
該表示式過濾使用了ip和udp協議,並且源埠為12345,目的埠為54321,並且源mac位址不為11:22:33:44:55:66,只有滿足上述所有條件,才會被到。

內容長度

eth頭

源mac,目的mac

14位元組

ip頭源ip,目的ip

20位元組

udp頭

源埠,目的埠

8位元組負載

資料不定

1. 得到mac

ethernet   ethe=newethernet();

if(pcaket.hasheader(ethe))

2. 得到ip

ip4    ip   =new ip4();

byte srcip=new byte[4];

byte dstip=new byte[4];

if(pcaket.hasheader(ip))

3. 得到埠

udp udp=new udp();

if(pcaket.hasheader(usp))

ICMP協議資料報捕獲

今天使用wireshark除錯乙個ping功能,使用icmp過濾串,發現ping本地子網乙個不存在的ip位址,wireshark沒有捕獲到任何的icmp資料報。而當ping另外乙個子網不存在的ip位址,wireshark捕獲到了icmp資料。分析如下 一.ping本地子網的ip位址 1.獲取目標ip...

DPDK 資料報捕獲基本流程(十六)

核心元件架構 啟動抓包程式之前,首先要利用dpdk sdk中dpdk埠檢視和繫結工具pci unbind進行抓包埠繫結。然後,申請huge頁並掛載huge分割槽。應用dpdk進行資料報捕獲時,主要利用rte eal init init port 和init mbuf pools 進行引數 埠及記憶體...

Linux下面捕獲多個資料報的例子

同樣是使用資料報捕獲開發包,這次採用的捕包函式不同,pcap loop pcap t p,int cnt,pcap handler callback,u char user 其中,p是libpcap控制代碼,引數cnt代表捕獲資料報的個數,如果是 1則捕獲無限多個,後面兩個引數分別代表 函式和 函式...