最近在网络包的过滤
安装Wincap Jpcap
Winpcap(windows packet capture)是windows 平台下一个免费,公共的网络访问系统。开发 Winpcap 这个项目的目的在于为win32 应用程序提供访问网络底层的能力。它提供了以下的各项功能:
1) 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2) 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3) 在网络上发送原始的数据报;
4) 收集网络通信过程中的统计信息。
Winpcap 的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,Winpcap 不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享
Jpcap :JAVA 语言虽然在TCP/UDP 传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。Jpcap 扩展包弥补了这一点。Jpcap 实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,Jpcap 调用
Winpcap/libpcap,而给 JAVA 语言提供一个公共的接口,从而实现了平台无关性。
package com.cpsec.test;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
import jpcap.PacketReceiver;
import jpcap.packet.Packet;
public class Test implements PacketReceiver,Runnable{
public NetworkInterface[] devices;
public NetworkInterfaceAddress addr;
public static JpcapCaptor jCaptor;
//public static ArrayList<FlowNode> flow=new ArrayList<FlowNode>();
public static JpcapSender sender=null;
public static Test T = new Test();
public StringBuffer sb1 = new StringBuffer();
public static boolean chooseMode=true;
public static long time;
public static long time1;
public static long beginTime;
public String s=new String();
//返回设备列表
public NetworkInterface[] getDevices() {
devices = JpcapCaptor.getDeviceList();
return devices;
}
public void desNetworkInterface() {
byte[]b;
sb1.append("---------------------------------------网卡信息-------------------------------------\n");
sb1.append("总共有 " + devices.length + " 个网络设备接口\n");
for (int i = 0; i < devices.length; i++) {
sb1.append("\n设备接口" + i+ ":\n");
sb1.append("网络接口名称:" + devices[i].name+"\n");
sb1.append("网络接口描述:" + devices[i].description+"\n");
sb1.append("数据链路层名称:" + devices[i].datalink_name+"\n");
sb1.append("数据链路层描述:" + devices[i].datalink_description+"\n");
sb1.append("是否是LOOPBACK设备:" + devices[i].loopback+"\n");
sb1.append("MAC地址:");
b =devices[i].mac_address;
for(int j=0;j < b.length;j++) {
//由于toHexString输出时,遇到第一个是00000000字节时,输出16进制只有一个0,所以要添加个0。我机器是这样,不知道其他的
if(j==0 && Integer.toHexString(b[0]&0xff).equals("0")) sb1.append(0);//字符串记得要用equals比较(忽略大小写的)
if(j<b.length-1)sb1.append(Integer.toHexString(b[j]&0xff) .toUpperCase()+ ":"); //转换为十六进制,并且是大写
else sb1.append(Integer.toHexString(b[j]&0xff) + " ");
}
sb1.append("\n");
}
sb1.append("-----------------------------------------------------------------------------------");
System.out.println(sb1);
}
@Override
public void run() {
T.devices = T.getDevices();
T.desNetworkInterface();
}
@Override
public void receivePacket(Packet arg0) {
// TODO Auto-generated method stub
}
// ---------------------Main-------------------------------
public static void main(String[] args) {
Thread t = new Thread(new Test());
t.start();
}
}