目前在使用Jnetpcap开发一款实时流量监控系统,其中需要实现捕获过滤器和显示过滤器,记录一下,也很简单,更多是调用API。
一、捕获过滤器
主要是利用PcapBpfProgram这个类
使用方法:
PcapBpfProgram filter = new PcapBpfProgram();
int res = pcap.compile(filter, expression, 1, 0);
pcap.setFilter(filter);
1.PcapBpfProgram filter = new PcapBpfProgram();用于创建一个过滤器对象,(PcapBpfProgram 遵循bpf过滤规则,详细规则参考https://www.wireshark.org/docs/man-pages/pcap-filter.html)此时仅仅创建此对象并不够,他并不知道要按照什么规则过滤,需要将过滤器与表达式对应起来。
2.对应起来的方法并不是操作filter对象,而是使用pcap.compile(PcapBpfProgram program, String expression, int optimize, int netmask) 参数一是第一步创建的filter,参数二是expression过滤表达式,参数三是是否优化(1表示进行优化,任何其他值表示否),参数四是确定广播地址所需的网络掩码(仅仅过滤可以无视),重点是前两个参数,返回值用于确定表达式是否符合规范,返回-1表示有错误。
3.为Pcap对象设置过滤器。
完整示例代码:
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.jnetpcap.Pcap;
import org.jnetpcap.PcapBpfProgram;
import org.jnetpcap.PcapIf;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;
public class Testt {
public static void main(String[] args) {
// 获取当前机器的网卡信息
StringBuilder errbuf = new StringBuilder();
List<PcapIf> alldevs = new ArrayList<PcapIf>();
int r = Pcap.findAllDevs(alldevs, errbuf);
if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
System.err.printf("Can't read list of devices, error is %s", errbuf.toString());
return;
}
// 输出网卡信息
System.out.println("Network devices found:");
int i = 0;
for (PcapIf device : alldevs) {
System.out.printf("#%d: %s [%s]\n", i++, device.getName(), device.getDescription());
}
// 选择要监控的网卡
PcapIf device = alldevs