2008年1月9日 星期三

Jpcap - 抓封包

抓封包前,須先指定要用哪張網路介面卡,我們可以利用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 意見: