使用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則捕獲無限多個,後面兩個引數分別代表 函式和 函式...