jpcap(使用方法)
1.jpcap说明与安装 JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点,jPcap是一个可以让java工作在链路层的类库;当然,它底层还是使用了本机API通过Jini调用,在javaAPI中得到数据。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。jPcap下载地址:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html; 你可以从jpcap网站上直接下载它的桌面应用程序进行测试,可以全面的统计本机的网络数据流量及收发包数据。
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. |
特别注意:jpcap运行时依赖winCap的类库,使用前必须在机地安装winCap(http://www.winpcap.org/如果是在liunx上,则请到http://www.tcpdump.org/下载)。本节中jPcap版本为0.6,winCap版本为4.0,运行与win32系统上。 )(
jPcap中的API非常简单,可查看其在线文档:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.html。当然,要灵活的使用,你必须有良好的tcp/ip协议知识基础,对常用的3个关键类,简介如下:
JpcapCaptor类
这个类是jPcap中的核心对象,一个JpcapCaptor对象代表了了系统中的一个网络接口卡;通过对JpcapCaptor对象的调用,实现网络数据包的抓取和发送。它供了一系列静态方法调用如:获取网卡列表,获取某个网卡上的JpcapCaptor对象。 |
|
static NetworkInterface[]getDeviceList() | 这个静态方法调用,可以返回机器上网络接口卡对象的数组,数组中每一个NetworkInterface元素对象代表一个网络接口;一般使用jPcap所要做的第一步调用就是这个方法。 |
static JpcapCaptoropenDevice(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);
- }
- }
- }
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) |
还记得我们介绍jPcap: “它底层还是使用了本机API通过Jini调用,在javaAPI中得到数据”,这是因为当前cp中少了jpcap要调用的本地dll库。将jpacp下载后lib下面的jpcap.dll复制到当前项目目录下,如果你仅得制了jpcap.dll,操作系统没有安装wincap(http://www.winpcap.org/install/default.htm,则会看到如下错误提示: )
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 |
博文出处:http://javafound.javaeye.com/blog/165704
1.jpcap说明与安装 JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点,jPcap是一个可以让java工作在链路层的类库;当然,它底层还是使用了本机API通过Jini调用,在javaAPI中得到数据。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。jPcap下载地址:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/index.html; 你可以从jpcap网站上直接下载它的桌面应用程序进行测试,可以全面的统计本机的网络数据流量及收发包数据。
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. |
特别注意:jpcap运行时依赖winCap的类库,使用前必须在机地安装winCap(http://www.winpcap.org/如果是在liunx上,则请到http://www.tcpdump.org/下载)。本节中jPcap版本为0.6,winCap版本为4.0,运行与win32系统上。 )(
jPcap中的API非常简单,可查看其在线文档:http://netresearch.ics.uci.edu/kfujii/jpcap/doc/javadoc/index.html。当然,要灵活的使用,你必须有良好的tcp/ip协议知识基础,对常用的3个关键类,简介如下:
JpcapCaptor类
这个类是jPcap中的核心对象,一个JpcapCaptor对象代表了了系统中的一个网络接口卡;通过对JpcapCaptor对象的调用,实现网络数据包的抓取和发送。它供了一系列静态方法调用如:获取网卡列表,获取某个网卡上的JpcapCaptor对象。 |
|
static NetworkInterface[]getDeviceList() | 这个静态方法调用,可以返回机器上网络接口卡对象的数组,数组中每一个NetworkInterface元素对象代表一个网络接口;一般使用jPcap所要做的第一步调用就是这个方法。 |
static JpcapCaptoropenDevice(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);
- }
- }
- }
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) |
还记得我们介绍jPcap: “它底层还是使用了本机API通过Jini调用,在javaAPI中得到数据”,这是因为当前cp中少了jpcap要调用的本地dll库。将jpacp下载后lib下面的jpcap.dll复制到当前项目目录下,如果你仅得制了jpcap.dll,操作系统没有安装wincap(http://www.winpcap.org/install/default.htm,则会看到如下错误提示: )
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 |
博文出处:http://javafound.javaeye.com/blog/165704
jpcap(使用方法)相关推荐
- JpcapHandler——Jpcap抓包处理
如果你想捕获Java程序中的网络包,那么你需要一些辅助工具,因为核心Java API不能访问底层的网络数据.但Jpcap是一种提供在Windows或UNIX系统上进行这种访问的Java API. Jp ...
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...
- Java面试题大全2021版
一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...
- jpcap的配置方法
这几天因为项目原因,要用到jpcap.jpcap本身是很小的东西,但一不小心配置就搞死你.烦了一下午,现在速度记录下来,免得以后悲剧重现. 最基本的配置我就随便说一下,反正这个网上一大把.首先下载jp ...
- Jpcap过滤GTunnel程序数据包
程序实现的目标 这次的目标要拿到纯的GTunnel数据包. GTunnel简要介绍 GTunnel是一款代理软件,该软件有4种模式--"标准模式"."Skype模式&qu ...
- java jpcap 抓包并分析_java利用Jpcap实现抓包
1.准备工作 Jpcap是一个可以监控当前网络情况的中间件,弥补了java对网络层以下的控制, 可以达到抓包的效果. Jpcap运行需要依赖winCap和Jpcap的dll动态库和Jpcap.jar包 ...
- java arp 攻击_基于Jpcap的Java ARP断网攻击
这是大二学习计算机网络的时候写的一个小程序,可实现局域网内断网攻击.这也作为学习网络层.数据链路层(在OSI模型中ARP协议属于链路层:而在TCP/IP模型中,ARP协议属于网络层)的其中一个小实验吧 ...
- java 8.0 sinffer_jpcap 配置方法,问题解决,模拟sniffer程序。(附JAVA程序,jar,dll包等环境)...
一. Eclipse环境下安装与配置Jpcap 相关源程序.jpcap jar包,dll包,帮助文档. 1.下载安装winpcap 2.jpcap官方文件中lib包下,有两个文件,jpcap.dl ...
- Pcap4J抓包基本使用方法
Pcap4J抓包基本使用方法 说明: 使用: 第一步: 第二步: 抓包: 例子的一些扩展: 抓包后处理: Pcap4J内置支持的协议报文类型 TIPS: 说明: 之前的项目需要一个Windows和Li ...
最新文章
- 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类...
- T75 大数加法+取模
- 我作为Java后端,分享一下入门Spark编程的经历!
- 【学时总结】 ◆学时·III◆ 二分图
- Host 'XXX' is not allowed to connect to this MySQL server 解决方案/如何开启MySQL的远程帐号...
- binlog2mysql,MySQL 数据恢复工具之binlog2sql
- 岛屿类-网格类问题-DFS | 力扣200. 岛屿数量
- 7-13 部落 (25 分)
- Java数据库篇4——表的约束
- PHP之mb_strrpos使用
- Maven scope中import的作用
- 社团管理系统软件测试,软件测试大作业-社团管理系统.doc
- linux vi文件加密和文件解密
- PIL Image P和L模式
- Python数据解析笔记+实战
- 盛迈坤电商:店铺获得流量有哪些方法
- 3-4课:各种花式编程语言大放送
- 过程计算机系统 pcs,科学网-对PCS(等离子体控制系统)软件基本结构的理解-章勇的博文...
- CVPR2020/UDA/图像翻译-Cross-domain Correspondence Learning for Exemplar-based Image Translation基于范例的跨域对应
- Liang的Rootkit习作-ZION