1

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);
        }
    }
}
4

1 に答える 1

5

の代わりにpcap.open(device, true);、試してみてくださいpcap.open(device, 65535, true, 1000); jpcap のデフォルトのスナップショットの長さは 96 バイトです。pcap.open(device, true);

于 2013-07-28T09:11:07.140 に答える