jpcap

jPCAP在JAVA中,並非一個真正去實現對數據鏈路層的控制,而是一個中間件,JPCAP調用winpcap/libpcap,給 JAVA語言提供一個公共的接口,從而實現了平台無關性。

基本介紹

文章分類,JPCAP簡介,JPCAP機制,NetworkInterface,JpcapCaptor,JpcapSender,Packet,

文章分類

JPCAP簡介

眾所周知,JAVA語言雖然在TCP/UDP傳輸方面給予了良好的定義,但對於網路層以下的控制,卻是無能為力的。JPCAP擴展包彌補了這一點。
在官方網站上聲明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系統。

JPCAP機制

JPCAP的整個結構大體上跟wincap/libpcap是很相像的,例如 NetworkInterface類對應wincap的typedef struct _ADAPTERADAPTER,getDeviceList()對應pcap_findalldevs()等等。
JPCAP有16個類,下面就其中最重要的4個類做說明。

NetworkInterface

該類的每一個實例代表一個網路設備,一般就是網卡。
這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法以外,沒有定義其它方法。
數據成員
NetworkInterfaceAddress[] java.lang.String datalink_description.數據鏈路層的描述。描述所在的區域網路是什麼網。例如,乙太網(Ethernet)、無線LAN網(wireless LAN)、令牌環網(token ring)等等。
java.lang.String datalink_name 該網路設備所對應數據鏈路層的名稱。具體來說,例如Ethernet10M、100M、1000M等等。
java.lang.String description網卡是XXXX牌子XXXX型號之類的描述。例如我的網卡描述:Realtek RTL8169/8110 Family Gigabit Ethernet NIC boolean Loopback標誌這個設備是否loopback設備。
byte[] mac_address網卡的MAC地址,6個位元組。
java.lang.String Name這個設備的名稱。例如我的網卡名稱:\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}

JpcapCaptor

該類提供了一系列靜態方法實現一些基本的功能。該類一個實例代表建立了一個與指定設備的連結,可以通過該類的實例來控制設備,例如設定網卡模式、設定過濾關鍵字等等。
數據成員
int dropped_packets 拋棄的包的數目。
protected int ID這個數據成員在官方文檔中並沒有做任何說明,查看JPCAP原始碼可以發現這個ID實際上在其JNI的C代碼部分傳進來的,這類本身並沒有做出定義,所以是供其內部使用的。實際上在對JpcapCator實例的使用中也沒有辦法調用此數據成員。
protected staticboolean[] instanciatedFlag同樣在官方文檔中沒有做任何說明,估計其為供內部使用。
protected staticint MAX_NUMBER_OF_INSTANCE 同樣在官方文檔中沒有做任何說明,估計其為供內部使用。
int received_packets收到的包的數目
方法成員
staticNetworkInterface[] getDeviceList() 返回一個網路設備列表。
staticJpcapCaptor openDevice(NetworkInterface interface, intsnaplen, booleanpromisc, intto_ms) 創建一個與指定設備的連線並返回該連線。注意,以上兩個方法都是靜態方法。Interface:要打開連線的設備的實例;Snaplen:這個是比較容易搞混的一個參數。其實這個參數不是限制只能捕捉多少數據包,而是限制每一次收到一個數據包,只提取該數據包中前多少位元組;Promisc:設定是否混雜模式。處於混雜模式將接收所有數據包,若之後又調用了包過濾函式setFilter()將不起任何作用;To_ms:這個參數主要用於 processPacket()方法,指定逾時的時間;
void Close()關閉調用該方法的設備的連線,相對於openDivece()打開連線。
JpcapSender getJpcapSenderInstance() 該返回一個JpcapSender實例,JpcapSender類是專門用於控制設備的傳送數據包的功能的類。
Packet getPacket() 捕捉並返回一個數據包。這是JpcapCaptor實例中四種捕捉包的方法之一。
int loopPacket(intcount, PacketReceiver handler) 捕捉指定數目的數據包,並交由實現了PacketReceiver接口的類的實例處理,並返回捕捉到的數據包數目。如果count參數設為-1,那么無限循環地捕捉數據。這個方法不受逾時的影響。還記得openDivice()中的to_ms參數么?那個參數對這個方法沒有影響,如果沒有捕捉到指定數目數據包,那么這個方法將一直阻塞等待。PacketReceiver中只有一個抽象方法void receive(Packet p)。
int processPacket(intcount, PacketReceiver handler) 跟loopPacket()功能一樣,唯一的區別是這個方法受逾時的影響,超過指定時間自動返回捕捉到數據包的數目。
int dispatchPacket(intcount, PacketReceiverhandler)跟processPacket()功能一樣,區別是這個方法可以處於“non-blocking”模式工作,在這種模式下dispatchPacket()可能立即返回,即使沒有捕捉到任何數據包。
void setFilter(java.lang.String condition, boolean optimize) .condition:設定要提取的包的關鍵字。Optimize:這個參數在說明文檔以及原始碼中都沒有說明,只是說這個參數如果為真,那么過濾器將處於最佳化模式。
void setNonBlockingMode(booleannonblocking)如果值為“true”,那么設定為“non-blocking”模式。
void breakLoop()當調用processPacket()和loopPacket()後,再調用這個方法可以強制讓processPacket()和 loopPacket()停止。

JpcapSender

該類專門用於控制數據包的傳送。
方法成員 void close() 強制關閉這個連線。
staticJpcapSender openRawSocket()這個方法返回的JpcapSender實例傳送數據包時將自動填寫數據鏈路層頭部分。
void sendPacket(Packet packet) JpcapSender最重要的功能,傳送數據包。需要注意的是,如果調用這個方法的實例是由JpcapCaptor的 getJpcapSenderInstance()得到的話,需要自己設定數據鏈路層的頭,而如果是由上面的openRawSocket()得到的話,那么無需也不能設定,數據鏈路層的頭部將由系統自動生成。

Packet

這個是所有其它數據包類(除DatalinkPacket和EthernetPacket之外)的父類。Jpcap所支持的數據包有:ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、 UDPPacket。

相關詞條

熱門詞條

聯絡我們