Jpcap包的學習筆記(五)如何使用JpcapCaptor例項來捕捉網路資料包(上部)
如何使用JpcapCaptor例項來捕捉網路資料包
當你通過開啟網絡卡裝置得到JpcapCaptor例項後,就可以利用它來捕捉網路資料包了。你可以利用以下兩種方法來捕捉網路資料包。第一種是通過回撥函式的機制,另一種是利用JpcapCaptor例項的getPacket()的方法,一個數據包一個數據包的接收。第一種是類似與事件觸發的機制。
方法一:回撥函式機制。
首先,你要自定義一個類,該類必順實現PacketReceiver介面,(在事件處理機制雷同)。PacketReciver介面只聲名了receivePacket(Packet packet) 方法,所以你要在你自義的類中實現該方法,方法體裡放置你處理接收到的資料包的程式碼,得到的資料包為型參packet.
接著,你就可以通過呼叫JpcapCaptor類的例項的processPacket()或loopPacket()來開始接收資料包。開始接收資料包後,當接收到資料包時就會回撥實現PacketReceiver介面的類的receivePacket的方法,使理接收到的資料包。
public int processPacket(int n , PacketRecevier handler);
引數1 型別 int 解釋:一次接收包的個數(個數到時到產生回撥)
引數2 型別 PacketRecevier 解釋:(回撥者)事件臨聽者
返回值:捕捉到的資料包的個數
功能:捕捉自定義個數的網路資料包。與loopPacket()方法不同,當接收超時(這個由前面的openDevice()方法的最後一個接收超時引數所決定)該方法立即返回。同樣的在非阻塞模式下是,沒有資料所可接收,該方法也立即返回。
public int loopPacket(int n, PacketRecevier handler):
引數1 型別 int 解釋:一次接收包的個數(個數到時到產生回撥)
如下為一個簡單的demo:
/** * @(#)GetPacketDemo.java * * 演示利用回撥機制來捕捉網路資料包 * @author scholar_ii * @version 1.00 2007/12/17 */ import jpcap.*; import jpcap.packet.*; public class GetPacketDemo { public static void main(String [] args) throws Exception { NetworkInterface[] devices = JpcapCaptor.getDeviceList(); int index = 0; if(devices.length>1)/*去掉虛擬網絡卡的處理*/ index = 1; JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20); captor.loopPacket(-1, new Receiver()); } } class Receiver implements PacketReceiver { /*例項receivePacket方法*/ public void receivePacket(Packet packet) { /*進行簡單的處理*/ System.out.println(packet); } }
引數2 型別 PacketRecevier 解釋:(回撥者)事件臨聽者
返回值:捕捉到的資料包的個數
功能:捉自定義個數的網路資料包。與processPacket()方法不同,該方法忽視超時,不支援工作在非阻塞模式。
注意:在這兩個方法的第一個引數中,你可以設定其值為-1。這時你可以停的捕捉資料包,直到捕捉結束,或錯誤發生為止。