java - 从 ByteBuffer 中获取 IP 包数据

标签 java android packet bytebuffer packet-capture

我正在尝试从数据包中获取源地址和目标地址。这就是我阅读数据包的方式:

private void debugPacket(ByteBuffer packet) {
    int buffer = packet.get();
    int ipVersion = buffer >> 4;
    int headerLength = buffer & 0x0F;
    headerLength *= 4;
    buffer = packet.get();      //DSCP + EN
    int totalLength = packet.getChar();  //Total Length
    buffer = packet.getChar();  //Identification
    buffer = packet.getChar();  //Flags + Fragment Offset
    buffer = packet.get();      //Time to Live
    int protocol = packet.get();      //Protocol
    buffer = packet.getChar();  //Header checksum

    String sourceIP  = "";
    buffer = packet.get();  //Source IP 1st Octet
    sourceIP += ((int) buffer) & 0xFF;
    sourceIP += ".";

    buffer = packet.get();  //Source IP 2nd Octet
    sourceIP += ((int) buffer) & 0xFF;
    sourceIP += ".";

    buffer = packet.get();  //Source IP 3rd Octet
    sourceIP += ((int) buffer) & 0xFF;
    sourceIP += ".";

    buffer = packet.get();  //Source IP 4th Octet
    sourceIP += ((int) buffer) & 0xFF;

    String destIP  = "";
    buffer = packet.get();  //Destination IP 1st Octet
    destIP += ((int) buffer) & 0xFF;
    destIP += ".";

    buffer = packet.get();  //Destination IP 2nd Octet
    destIP += ((int) buffer) & 0xFF;
    destIP += ".";

    buffer = packet.get();  //Destination IP 3rd Octet
    destIP += ((int) buffer) & 0xFF;
    destIP += ".";

    buffer = packet.get();  //Destination IP 4th Octet
    destIP += ((int) buffer) & 0xFF;

    String hostName;
    try {
        InetAddress addr = InetAddress.getByName(destIP);
        hostName = addr.getHostName();
    } catch (UnknownHostException e) {
        hostName = "Unresolved";
    }

    Log.d(this.getClass().getSimpleName(), "Packet: IP Version=" + ipVersion + ", Header-Length=" + headerLength + ", Total-Length=" + totalLength
            + ", Destination-IP=" + destIP + ", Hostname=" + hostName + ", Source-IP=" + sourceIP+ ", Protocol=" + protocol);
}

它对前几个数据包工作正常,但有时我会在 packet.get() 行之一收到 BufferUnderflowException。我该如何防止这种情况?

最佳答案

真不敢相信我没早点发现这个。我忘了在 debugPacket(packet) 之后调用 packet.clear()

关于java - 从 ByteBuffer 中获取 IP 包数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37246063/

相关文章:

java - java中ClassName<Something>中的<Something>是什么意思?

android - 在android中实现简单的SeekBar

networking - 网络流量嗅探时有什么办法可以过滤Hadoop数据包吗?

c - 原始 LWIP 将 TCP 传输发送到静态 IP

java - 如何在android中的项目单击中从 ListView 中获取歌曲

java - Java 中的 BaseX 数据库添加

java - 使用 Class.getResource() 时如何防止路径遍历攻击

android - Jetpack Compose 中的 PaddingValues(底部填充除外)

java - 如何在eclipse中使用和导入eSpeak?

networking - 处理具有未知 IPv6 扩展 header 的数据包