这个样例是非常经典的libpcap样例,它首先获取到一个网络设备的列表,用简单的ASCLL码菜单表示出来 然后 等待用户选择其中的一个接口。我们选择列表中的第一个接口代替处理输入来简化程序。
然后打开这个用于捕获的接口,使用一个 packet handler(数据包处理器)来循环的抓包。打印出packets的一些简单信息,然后关闭处理器,退出程序。
package org.jnetpcap.examples;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
// 以下简单的介绍一下我们药要使用的类,具体的用法请查看api文档
import org.jnetpcap.Pcap;
/**
* Pcap这个类是一个和 libpcap和winpcap 中 pcap_t 结构等同的主要类。它用于提供一个各种
* 库方法到java 的直接映射
* Pcap提供几个静态方法,用来 发现网络接口,随后打开 openlive,openDead,或者
* openOffline pcap捕获会话。以上都是返回一个 Pcap 对象。这个对象是C语言的pcap_t结构
* java vm 地址空间的支持。任何在Pcap对象上 的 非静态操作,都会转换为使用 JNI api 匹配
* Libpcap 中 pcap_t C 的方法来完成调用。
* 用了以上提及的3个静态方法,一定要调用 close() 方法来释放 Libpcap 的资源
* 如果 Pcap已经关闭了,但是非静态方法还是调用了,那就会抛出一个 IllegalStateException
*/
import org.jnetpcap.PcapIf;
/**
* 这个类关联的是本地的 pcap_if_t 结构,把地址模拟为链式的地址结构。只读。
*/
import org.jnetpcap.packet.PcapPacket;
/**
* 一个pcap 的数据包,但是不能用于创建一个新的数据包,具体的结构解释于代码使用中
*/
import org.jnetpcap.packet.PcapPacketHandler;
/**
* 一个处理,监听,回调的接口,用于在一个新的packet捕获的时候,获得通知
*/
/**
* 以下是这个样例的输出 :
* Ps:在ubuntu下的时候,可能会出现一些运行时刻的权限问题,不能获取设备的权限
*
* Network devices found:
* #0: \Device\NPF_{BC81C4FC-242F-4F1C-9DAD-EA9523CC992D} [Intel(R) PRO/100 VE]
* #1: \Device\NPF_{E048DA7F-D007-4EEF-909D-4238F6344971} [VMware Virtual Ethernet Adapter]
* #2: \Device\NPF_{5B62B373-3EC1-460D-8C71-54AA0BF761C7} [VMware Virtual Ethernet Adapter]
* #3: \Device\NPF_GenericDialupAdapter [Adapter for generic dialup and VPN capture]
*
* Choosing 'Intel(R) PRO