Jpcap使用指南

1.    獲取網絡接口列表
要想從網絡中捕獲數據包,第一件必需要作的事就是獲取本機的網絡接口列表。
Jpcap提供了方法JpcapCaptor.getDeviceList()完成這個任務,該方法返回一組NetworkInterface對象。
NetworkInterface接口對象包含了對應網絡接口的一些信息,例如:名稱、描述、IP以及MAC地址以及數據鏈路層名稱和描述。
   
   
   
   
import jpcap.JpcapCaptor;import jpcap.NetworkInterface;import jpcap.NetworkInterfaceAddress;public class TCPCollection { public static void main(String[] args){ NetworkInterface[] devices = JpcapCaptor.getDeviceList();//獲取網絡接口列表 for(int i = 0; i < devices.length; i++){ //名稱、描述 System.out.println(i + ":" + devices[i].name + "(" + devices[i].description + ")"); //數據鏈路層名稱、描述 System.out.println("datalink:" + devices[i].datalink_name + "(" + devices[i].datalink_description + ")"); //MAC地址 System.out.print(" MAC address:"); for(byte b: devices[i].mac_address){ System.out.print(Integer.toHexString(b & 0xff) + ":"); } System.out.println(); //IP地址、子網掩碼、廣播地址 for(NetworkInterfaceAddress a : devices[i].addresses){ System.out.println(" address: " + a.address + "|" + a.subnet + "|" + a.broadcast); } } } }
2.    打開網絡接口
一旦有了網絡接口列表就能夠從選定用於捕獲數據包的網絡接口,可使用方法JpcapCaptor.openDevice()來打開網絡接口。
   
   
   
   
public static void main(String[] args){ NetworkInterface[] devices = JpcapCaptor.getDeviceList();//獲取網絡接口列表 int index = 0; try { JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20); } catch (IOException e) { e.printStackTrace(); System.out.println("抓取數據包時出現異常!!!"); }}
調用JpcapCaptor.openDevice()方法必須指定下列參數:

名稱                                   目的 java

NetworkInterderface       要打開的網絡接口。 網絡

intrface                               tcp

int snaplen                       一次捕獲數據包的最大byte數。 oop

boolean prommics         是否採用混亂模式 性能

混亂模式中,能夠捕獲全部數據包,即使源MAC或目的MAC地址與打開的網絡接口的MAC地址不相同。this

而非混亂模式中只能捕獲由宿主機發送和接收的數據包。 spa

int to_ms                         捕獲的數據包的超時設置(數量級爲毫秒)。 code

3.    從網絡接口捕獲數據包
一旦得到了JpcapCaptor實例就能夠用來捕獲來自網絡接口的數據包。
使用JpcapCaptor實例來捕獲數據包主要有兩種方法:回調(callback)以及逐個捕獲(one-by-one)。
回調方法
實現的細節:
首先定義一個實現PacketReceiver接口的類。PacketReceiver接口中定義了receivePacket()方法,只需實現receivePacket()這個方法。
   
   
   
   
class PacketPrinter implements PacketReceiver { //this method is called every time Jpcap captures a packet public void receivePacket(Packet packet){ System.out.print(packet); }}
而後可使用回調的方法調用JpcapCaptor.processPacket()或JpcapCaptor.loopPacket()方法開始數據包的捕獲。
processPacket()或loopPacket()方法能夠指定捕獲的數據包的數量。-1表示無限地捕獲數據包。
   
   
   
   
JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20);captor.processPacket(2, new PacketPrinter());captor.close();
兩種回調方法:processPacket()和loopPacket()很是類似。一般建議使用processPacket(),由於它支持超時以及非阻塞模式,而loopPacket()並不支持。
逐個捕獲
使用回調方法稍微有點複雜,由於並不知道Jpcap何時調用回調方法。若是不使用回調方法,能夠調用JpcapCaptor.getPacket()方法來捕獲數據包。
getPacket()只是簡單返回一個捕獲的數據包,能夠屢次使用getPacket()方法捕獲連續的數據包。
   
   
   
   
            JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20); for(int i=0; i<10; i++){ System.out.println(i + ":" + captor.getPacket()); } captor.close();
4.    設置捕獲過濾器
在Jpcap中能夠設置過濾器使得Jpcap不捕獲不須要的數據包。例如:若是僅僅只需捕獲TCP/IPv4數據包,就能夠設置過濾器,其方法以下例所示:
   
   
   
   
JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20); captor.setFilter("ip and tcp", true);
過濾器表達式「ip and tcp」表示「只保留IPv4而且TCP數據包,並將其交付給應用」。過濾器的設置能夠減小所須要處理的數據包而且提升應用的性能。
5.    將捕獲的數據包存擋
能夠將捕獲的數據包寫入一個二進制文件,過後使用Jpcap或支持tcpdump格式文件的其它應用程序進行查詢。
存儲捕獲的數據包首先須要使用JpcapWriter.openDumpFile()打開一個文件,參數分別是用來捕獲數據包的一個JpcapCaptor實例以及String文件名。
   
   
   
   
JpcapCaptor captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20); JpcapWriter writer = JpcapWriter.openDumpFile(captor, "yourfilename");
一旦經過openDumpFile()方法得到一個JpcapWriter的實例,就可使用JpcapWriter.writePacket()存儲捕獲的數據包。
將全部要存儲的數據都存儲以後,必須使用JpcapWriter.close()方法關閉打開的文件。
   
   
   
   
for(int i=0; i<10; i++){ Packet packet = captor.getPacket(); writer.writePacket(packet); } writer.close();
6.    讀入文件中的數據包
在Jpcap中,可使用JpcapCaptor.openFile()方法打開一個由JpcapWriter存儲的文件,並從中讀入數據包。
相似於JpcapCaptor.openDevice()方法,JpcapCaptor.openFile()方法將返回一個JpcapCaptor類的實例,所以可使用「從網絡接口捕獲數據包」中描述的方式來從文件中讀取數據包。
 
7.    經過網絡接口發送數據包
發送一個數據包首先須要調用JacapSender.openDevice()或JacapSender.getJpcapSenderInstance()方法。
一旦得到一個JpcapSender實例,就能夠將Packet類實例傳遞給JpcapSender.sendPacket()方法。
   





















相關文章
相關標籤/搜索