Java抓包JpcapCaptor笔记及源码
package test6;
import java.io.IOException;
import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.PacketReceiver;
import jpcap.packet.ARPPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
public class TestZonJie implements PacketReceiver {
public static void main(String[] args) {
JpcapCaptor jpcap = null;
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
NetworkInterface deviceName = devices[2];
try {
jpcap = JpcapCaptor.openDevice(deviceName, 2000, false, 1);//发送
//
//JpcapCaptor.openDevice(intrface, snaplen, promisc, to_ms)
//snaplen用于指定所捕获包的特定部分,在一些系统上(象xBSD and Win32等)驱动只给出所捕获数据包的一部分而不是全部
//promisc指明网卡处于混杂模式
//to_ms 参数指定读数据的超时控制,超时以毫秒计算。
//如果该参数为0那么意味着没有超时控制,对网卡的读操作在没有数据到来是将永远堵塞。
//如果为-1那么对网卡的读操作将立即返回不管有没有数据可读。
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(jpcap);
jpcap.loopPacket(-1, new TestZonJie());
}
@Override
public void receivePacket(Packet packet) {
//这个关键字的用法是:A instanceof B ,返回值为boolean类型,
//用来判断A是否是B的实例对象或者B子类的实例对象,如果是则返回true,否则返回false
if(packet instanceof TCPPacket) {
TCPPacket tcppacket = ((TCPPacket)packet);
//System.out.println(tcppacket.src_ip);
//HTTP端口(80),HTTPS端口(443)和FTP端口(21)、NNTP使用TCP端口号119
int post=tcppacket.src_port;
System.out.println(post==80?"HTTP端口":post==21?"FTP端口":post==443?"HTTPS端口":post);
}
if(packet instanceof ARPPacket) {//如果是arp数据包
ARPPacket tcppacket1 = ((ARPPacket)packet);
// System.out.println(tcppacket1.getSenderHardwareAddress());
}
if(packet instanceof IPPacket) {//如果是ip数据包
}
/*System.out.println("************************************************************");
System.out.println(packet.caplen);
System.out.