Jpcap is a Java class package that allows Java applications to capture and/or send packets to the network.
Jpcap is based on libpcap/winpcap and Raw Socket API. Therefore, Jpcap is supposed to work on any OS on which libpcap/winpcap has been implemented. Currently, Jpcap has been tested on FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP.
Jpcap supports the following types of packets: Ethernet, IPv4, IPv6, ARP/RARP, TCP, UDP, and ICMPv4. Other types of packets are captured as raw packets (i.e., instances of the Packet class) which contains the whole data of the packets. This allows Java applications to analyze unsupported packet types. |
JpcapCaptor
類
這個類是jPcap中的核心對象,一個JpcapCaptor對象表明了了系統中的一個網絡接口卡;經過對JpcapCaptor對象的調用,實現網絡數據包的抓取和發送。它供了一系列靜態方法調用如:獲取網卡列表,獲取某個網卡上的JpcapCaptor對象。 |
|
static NetworkInterface[]getDeviceList() | 這個靜態方法調用,能夠返回機器上網絡接口卡對象的數組,數組中每個NetworkInterface元素對象表明一個網絡接口;通常使用jPcap所要作的第一步調用就是這個方法。 |
static JpcapCaptor openDevice(NetworkInterface interface, int snaplen, boolean promisc, int to_ms) | 取得在指定網卡上的Jpcapcator對象,Interface:上所返回的某個網卡對象Snaplen:一次性要抓取數據包的最大長度。Promisc:設置是否混雜模式。處於混雜模式將接收全部數據包,若是設置爲混雜模式後調用了包過濾函數setFilter()將不起任何做用;To_ms:這個參數主要用於processPacket()方法,指定超時的時間; |
int loopPacket(int count, PacketReceiver handler) | 經常使用的一種模式是,經過getDeviceListloopPacket方法中count參數表示要抓的包的數目,若是設備爲-1,責表示永遠抓下去---方法不會返回;第二個參數必須是實現了PacketReceiver接口的一個對象,抓到的包將調用這個PacketReceiver對象中的receivePacket(Packet packet)方法處理;因此抓包前,咱們必須寫一個實現了PacketReceiver接口的類。 特別注意的是:這個方法的調用會阻塞等待,若是沒有抓到指定count的包、或count設爲-1,這個方法都不會返回。因此,聰明的你確定想到了,若是要抓取機器上多個卡口上的包,這個方法必須放在一個獨立的線程中。()取得全部網絡接口,再經過openDevice方法取得每一個網絡接口上的JpcapCaptor對象,就可經過這個方法抓包了。 |
void breakLoop() | 即上JpcapCaptor對象上阻塞等待的方法強制終止。當調用processPacket()和loopPacket()後,再調用這個方法能夠強制讓processPacket()和loopPacket()中止。 |
interface PacketReceiver :數據包處理器接口定義,要處理收到的數據包,必須編寫這個接口的實現類,在JpcapCaptor對象的loopPacket方法中調用. 這個接口中僅有一個方法定義: | |
Void receivePacket (Packet p) | 實現類中處理接收到的Packet對象的方法。每一個Packet對象表明從熱指定網絡接口上抓取到的數據包。 |
NetworkInterface類該類的每個實例表明一個網絡設備,通常就是網卡。這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法之外,沒有定義其它方法。(但我還不知它與jdk5.0以上的API中的java.net.InterfaceAddress類是否能夠互換)。 | |
NetworkInterfaceAddress[]addresses | 這個接口的網絡地址。設定爲數組應該是考慮到有些設備同時鏈接多條線路,例如路由器。但咱們的PC機的網卡通常只有一條線路,因此咱們通常取addresses[0]就夠了。 |
java.lang.String datalink_description. | 數據鏈路層的描述。描述所在的局域網是什麼網。例如,以太網(Ethernet)、無線LAN網(wireless LAN)、令牌環網(token ring)等等。 |
java.lang.String datalink_name | 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} |
import jpcap.JpcapCaptor; import jpcap.NetworkInterface; import jpcap.PacketReceiver; import jpcap.packet.Packet; /** * 使用jpcap顯示網絡接口數據. * @author 胡東峯 */ public class DispalyNetInterface { public static void main(String args[]){ try{ //獲取本機上的網絡接口對象數組 final NetworkInterface[] devices = JpcapCaptor.getDeviceList(); for(int i=0;i<devices.length;i++){ NetworkInterface nc=devices[i]; //一塊卡上可能有多個地址: String address=""; for(int t=0;t<nc.addresses.length;t++){ address+="|addresses["+t+"]: "+nc.addresses[t].address.toString(); } //打印說明: System.out.println("第"+i+"個接口:"+"|name: "+nc.name +"|loopback: "+nc.loopback+"\r\naddress: "+address); } }catch(Exception ef){ ef.printStackTrace(); System.out.println("顯示網絡接口數據失敗: "+ef); } } }
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jpcap in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1030) at jpcap.JpcapCaptor.<clinit>(JpcapCaptor.java:250) at cn.netjava.cewolf.DispalyNetInterface.main(DispalyNetInterface.java:19) |
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\workspace\trafficManager\jpcap.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1676) at java.lang.Runtime.loadLibrary0(Runtime.java:823) at java.lang.System.loadLibrary(System.java:1030) at jpcap.JpcapCaptor.<clinit>(JpcapCaptor.java:250) at cn.netjava.cewolf.DispalyNetInterface.main(DispalyNetInterface.java:17) |
第0個接口:|name: \Device\NPF_GenericDialupAdapter|loopback: false
address: 第1個接口:|name: \Device\NPF_{2A5FD532-45A3-4A2B-9B68-F34C14E4FD2C}|loopback: falseaddress: |addresses[0]: /220.192.159.105第2個接口:|name: \Device\NPF_{14303C1A-4DB3-4BC9-979E-34063E070CBB}|loopback: falseaddress: |addresses[0]: /192.168.1.44 |
html