gpt4 book ai didi

java - 使用 jpcap 获取完整的 TCP 数据包数据

转载 作者:行者123 更新时间:2023-11-29 07:55:43 28 4
gpt4 key购买 nike

我使用了 jpcap 教程中的一个简单程序。我想监听端口 4444 以检查我的其他客户端-服务器应用程序。我遇到了一个问题:方法 TCPPacket.getTCPData() 返回 byte[] 数组,限制在 30 个元素中。我知道数据包包含超过 30 个字节的有用数据,不包括 TCP header 字节。

如何获取超过 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);
}
}
}

最佳答案

代替 pcap.open(device, true);,试试 pcap.open(device, 65535, true, 1000); jpcap 的默认快照长度是96 个字节,这意味着如果您使用 pcap.open(device, true);

打开,您只能获得数据包的前 96 个字节

关于java - 使用 jpcap 获取完整的 TCP 数据包数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17906635/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com