抓封包前,須先指定要用哪張網路介面卡,我們可以利用JpcapCaptor.openDevice()來選擇。
public static JpcapCaptor openDevice(NetworkInterface interface, int snaplen, boolean promisc, int to_ms)
throws java.io.IOException
interface - 指定網路卡,可用getDeviceList()來取得
snaplen - 封包最大的長度
promisc - 是否將網路卡設定成promisc模式
to_ms - processPacket的timeout值
有兩種抓封包的方法
- callback
- one-by-one
使用callback的方法,必須先實作PacketReceiver這個interface。
PacketReceiver定義一個receivePacket(),我們必實作這個方法。
class PacketPrinter implements PacketReceiver {
public void receivePacket(Packet packet) {
System.out.println(packet);
}
}
接著就可以用processPacket()或loopPacket()來抓封包。
這兩個差別是在於processPacket()是non-blocking而loopPacket()是blocking的方式。
public int processPacket(int count, PacketReceiver handler)
public int loopPacket(int count, PacketReceiver handler)
count指的是要抓多少封包,-1則是一直抓。
one-by-one的法就是一個封包一個封包抓。
public Packet getPacket()
同時我們也可以設定filter來過濾我們想要抓取的封包。
public void setFilter(java.lang.String condition, boolean optimize) throws java.io.IOException
condition - 所要過濾的條件,和tcpdump的filter設定一樣,例如要抓ICMPv6的封包:
setFilter(icmpv6, true);
0 意見:
張貼留言