jpcap チュートリアルの簡単なプログラムを使用します。ポート 4444 でリッスンして、他のクライアント サーバー アプリケーションを確認したいと考えています。そして、私は問題を抱えています: メソッド TCPPacket.getTCPData() は、バイト[]配列を30要素に制限して返します。パケットは、TCP ヘッダー バイトを除く 30 バイト以上の有用なデータで構成されていることを知っています。
30 バイトを超えるパケット データを取得するにはどうすればよいですか?
私がチェックしたところ、メソッド tcpPacket.getPayloadDataLength() は 500 以上を返し、TCPPacket.getTCPData() は 30 バイトの配列を返します...なぜ 30 しかないのですか?
コードはこちら
public class Test {
public static void main(String[] args) {
try {
Test test = new Test(PacketCapture.lookupDevices()[5].trim().split("\\s")[0]);
} catch(Exception e) {
e.printStackTrace();
}
}
public Test(String device) throws Exception {
// Initialize jpcap
PacketCapture pcap = new PacketCapture();
System.out.println("Using device '" + device + "'");
pcap.open(device, true);
pcap.setFilter("port 4444", true);
pcap.addPacketListener(new PacketHandler());
System.out.println("Capturing packets...");
pcap.capture(-1); // -1 is infinite capturing
}
}
class PacketHandler implements PacketListener {
BufferedOutputStream stream;
public PacketHandler() throws IOException {
Path path = Paths.get("out.txt");
stream = new BufferedOutputStream(
Files.newOutputStream(path, StandardOpenOption.CREATE, StandardOpenOption.APPEND));
}
public void packetArrived(Packet packet) {
try {
// only handle TCP packets
if(packet instanceof TCPPacket) {
TCPPacket tcpPacket = (TCPPacket)packet;
byte[] data;
data = tcpPacket.getTCPData();
stream.write(data);
stream.write("\r\n----------\r\n".getBytes());
stream.flush();
}
} catch( Exception e ) {
e.printStackTrace(System.out);
}
}
}