使用JPcap可以发包,使用JnetPcap可以接收和过滤包。现在项目中遇到的问题总结如下。
1. 环境搭建
如果是在Window下则必须在path路径下存在JnetPcap.dll和Jpcap.dll文件,如果是在linux环境下,可以将JnetPcap.so和JnetPcap.so存放到/usr/lib目录下即可,但是最好的解决方案是讲将两个so文件存放到项目目录下,然后使用
System.load(System.getProperty(“user.dir”)+/so文件相对路径)。
2. 无法打开网卡,或者是存在主备网卡的问题(bond网卡)
解决方案:直接使用网卡名称打开网卡
Pcap pcap=Pcap.openLive("eth0",64*1024,Pcap.MODE_NON_PROMISCUOUS,new StringBuilder());
//Pcap pcap=Pcap.openLive(网卡名称,包大小,网卡模式,错误信息);
说明:网卡名称一般为eth0等
包大小一般为64*1024
网卡模式一般为Pcap.MODE_NON_PROMISCUOUS混合模式
错误信息其中存放的是当网卡打开失败后返回的系统信息,一般为StringBuilder
3. 如何循环捕包
通过上面得到的Pcap网卡对象就可以循环捕包了,大致程序逻辑如下:
由于会一台机器上可能会有多个网卡,所以抓包前应先进行网卡的绑定
Pcap pcap=Pcap.openLive("eth0",64*1024,Pcap.MODE_NON_PROMISCUOUS,new StringBuilder());
PcapBpfProgram filter = new PcapBpfProgram();
String expression=” ”;
int r=pcap.compile(filter , expression , 0, 0);
if(r==Pcap.OK){
Pcap.setFilter(filter);
}
PcapPacketHandler