1. 程式人生 > >Jpcap包的學習筆記(五)如何使用JpcapCaptor例項來捕捉網路資料包(上部)

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。這時你可以停的捕捉資料包,直到捕捉結束,或錯誤發生為止。