2枚のNIカードから特定のスレッドで同時にパケットをキャプチャするアプリをコーディングしています。
jnetPcapを使用していて、jpackethanlerのメソッドnextPacketでキャプチャされたパケットを取得しています。現在のパケットの情報をJListに表示する必要がありますが、defaultListModelを使用してmodel1.addElement(packetinfo)と書き込むと、JListはランダムに空白になります。
私のコード:
new Thread(){
@Override
public void run(){
StringBuilder errbuf = new StringBuilder(); // For any error msgs
int snaplen = 64 * 1024; // Capture all packets, no trucation
int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
int timeout = 10 * 1000; // 10 seconds in millis
Pcap pcap1 =
Pcap.openLive(Variables.getDevice1().getName(), snaplen, flags, timeout, errbuf);
if (pcap1 == null) {
System.err.printf("Error while opening device for capture: "
+ errbuf.toString());
return;
}
PcapPacketHandler<String> jpacketHandler1 = new PcapPacketHandler<String>() {
int count = 1;
@Override
public void nextPacket(PcapPacket packet, String user) {
// ALL PACKETS FROM DEVICE 1 HERE
int packetSize = packet.size();
int packetCount = count++;
String desc = String.format("No.: %15d | HDRSize : %-4d", packetCount,packetSize);
device1Model.addElement(desc); // this adds desc to JLIST
}
};
pcap1.loop(Pcap.LOOP_INFINITE, jpacketHandler1, "");
pcap1.close();
}
}.start();
何がよりスムーズに変化すると同時に、パケットが失われることはありません。アプリの正しい機能のためにすべてのパケットをキャッチする必要があるためです。
ありがとうございました。