PacketCapture
コンストラクタは10 回以上使用できません。コンストラクターは次のようになるため、この動作はハードコーディングされています。
/**
* Create a new packet capture instance.
*/
public PacketCapture() {
if (nextInstance >= INSTANCE_MAX) {
throw new Error("Too many instances, exceeds " + INSTANCE_MAX);
}
instanceNum = nextInstance++;
}
ping 要求をキャプチャするには、次のコードを試してください。
public class Main {
public static void main(String[] args) throws CaptureDeviceLookupException {
Capture cap = new Capture();
cap.doCapture();
}
}
class PingListener implements PacketListener {
@Override
public void packetArrived(Packet packet) {
try {
// only ICMP packages
if (packet instanceof ICMPPacket) {
ICMPPacket tcpPacket = (ICMPPacket) packet;
int data = tcpPacket.getMessageCode();
// only echo request packages
if (data == ICMPMessages.ECHO) {
// print source and destination.
String srcHost = tcpPacket.getSourceAddress();
String dstHost = tcpPacket.getDestinationAddress();
System.out.println("Ping from: " + srcHost + " to " + dstHost);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Capture {
public void doCapture() {
// create capture instance
PacketCapture capture = new PacketCapture();
// add listener that handles incomming and outgoing packages
PingListener pingListener = new PingListener();
capture.addPacketListener(pingListener);
// m_pcap.setFilter("filter here or in handler", true);
try {
capture.open("\\Device\\NPF_{...}", true); // connect capture to device
while (true) {
capture.capture(1); // capture one package
}
} catch (Exception e) {
e.printStackTrace(); // exception during capture or handling of
// packages
} finally {
// technically never reached as the loop goes on forever.
// if loop terminates after a while then:
// remove listener
capture.removePacketListener(pingListener);
// end capture (only necessary, if PacketCapture still waits for
// other packages)
capture.endCapture();
// close connection to capture device
capture.close();
}
}
}
クラスの誤解があると思いますPacketCapture
。実際には 1 つのパッケージをキャプチャしないため、破棄されます。パッケージをキャプチャするデバイスへの接続を開き、その接続を保持している限りリッスンを開始します。n
次に、 を呼び出してパッケージのキャプチャを開始しますcapture.capture(n)
。「キャプチャ」がプログラムをブロックしている間に到着するパッケージごとに、リスナーが呼び出されます。
または、while ループを削除して を使用することもできますcapture.capture(-1)
。これにより、別のデバイスからのキャプチャを閉じるまで、プログラムが永久にブロックされます。