分類  >  互聯網 >

JpcapHandler——Jpcap抓包處置

tags:    時間:2013-12-27 15:47:50
JpcapHandler——Jpcap抓包處理

如果你想捕獲Java程序中的網路包,那麼你需要一些輔助工具,因為核心Java API不能訪問底層的網路數據。但Jpcap是一種提供在Windows或UNIX系統上進行這種訪問的Java API。
Jpcap不是一種純粹的Java解決方案;它依賴本地庫的使用。在Windows 或 UNIX上,你必須有必要的第三方庫,分別是WinPcap或libpcap。

Jpcap的工作原理 :
Jpcap使用一個事件模型來讓你處理包。首先你必須創建一個執行介面jpcap.JpcapHandler的類。

public class JpcapTip implements JpcapHandler {  public void handlePacket(Packet packet){  System.out.println(packet);  }  }  


為了捕獲包,你需要告訴Jpcap你想用哪個網路設備來監聽。API提供了jpcap.Jpcap.getDeviceList()方法以滿足這一目的。這個方法返回一列字元串,你可以象如下使用它:
String[] devices = Jpcap.getDeviceList();

一旦你有了一個設備名稱的目錄,你必須選取一個用來監聽:
String deviceName = devices[0];

選擇一個設備之後,通過Jpcap.openDevice()方法打開它。openDevice()方法需要四個參數:即將打開的設備名,從讀取每個包的最大位元組數,說明是否將設備設為混雜模式的Boolean值,和以後調用processPacket()方法要使用到的超時值。
Jpcapjpcap = Jpcap.openDevice(deviceName, 1028, false, 10000);

openDevice()方法將一個參數返回到用以捕獲的Jpcap對象。既然有了Jpcap實例,你可以調用processPacket() 或loopPacket()開始監聽了。這兩種方式都帶有兩個參數:捕獲的最大包數可以是-1(說明沒有限制);執行JpcapHandler的一個類的實例。

如果你調用processPacket(),那麼Jpcap將一直捕獲包,直到超過openDevice中規定的時限或達到了規定的最大包數。loopPacket()則將一直捕獲包,直到達到最大包數,如果沒有最大數限制,它將永遠運行下去。就像下面這樣調用:

jpcap.loopPacket(-1, new JpcapTip());

下面則是全部測試類的代碼:

import jpcap.JpcapHandler;  import jpcap.Jpcap;  import jpcap.Packet;   public class JpcapTip implements JpcapHandler {  public void handlePacket(Packet packet){  System.out.println(packet);  }   public static void main(String[] args) throws java.io.IOException{  String[] devices = Jpcap.getDeviceList();  for (inti = 0; i < devices.length; i++) {  System.out.println(devices[i]);  }  String deviceName = devices[0];  Jpcapjpcap = Jpcap.openDevice(deviceName, 1028, false, 1);  jpcap.loopPacket(-1, new JpcapTip());  }  } 


為了執行這個類,你必須確保虛擬機可以找到Jpcap的本地庫。在Window上,如果jpcap.dll在庫地址目錄中,Java命令如下:

java -Djava.library.path=lib -cp lib\jpcap.jar;. JpcapTip

執行測試類的輸出則如下(出於篇幅考慮進行了縮減):

ARP REQUEST 00:06:5b:01:b2:4d(192.168.15.79)
00:00:00:00:00:00(192.168.15.34)
ARP REQUEST 00:06:5b:01:b2:4d(192.168.15.79)
00:00:00:00:00:00(192.168.15.34)
1052251329:525479 192.168.15.103->255.255.255.255 protocol(17) priority(0)
hop(
offset(0) ident(59244) UDP 1211 1211

推薦閱讀文章

Bookmark the permalink ,來源:互聯網