2016-05-16 51 views
0

我試圖從數據包中獲取源地址和目標地址。這就是我在讀包:從ByteBuffer獲取IP數據包數據

private void debugPacket(ByteBuffer packet) 
{ 
    int buffer = packet.get(); 
    int version; 
    int headerlength; 
    version = buffer >> 4; 
    headerlength = buffer & 0x0F; 
    headerlength *= 4; 
    Log.d(TAG, "IP Version:"+version); 
    Log.d(TAG, "Header Length:"+headerlength); 

    String status = ""; 
    status += "Header Length:"+headerlength; 

    buffer = packet.get();  //DSCP + EN 
    buffer = packet.getChar(); //Total Length 

    Log.d(TAG, "Total Length:"+buffer); 

    buffer = packet.getChar(); //Identification 
    buffer = packet.getChar(); //Flags + Fragment Offset 
    buffer = packet.get();  //Time to Live 
    buffer = packet.get();  //Protocol 

    Log.d(TAG, "Protocol:"+buffer); 

    status += " Protocol:"+buffer; 

    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; 

    Log.d(TAG, "Source IP:"+sourceIP); 

    status += " Source IP:"+sourceIP; 

    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; 

    Log.d(TAG, "Destination IP:" + destIP); 

    status += " Destination IP:"+destIP; 

    try { 
     InetAddress addr = InetAddress.getByName(destIP); 
     String host = addr.getHostName(); 
     Log.d(TAG, "Hostname:" + host); 
    } 
    catch (UnknownHostException e) { 
     Log.d(TAG,"Unknown host"); 
    } 
} 

它工作正常,在最初的幾個包,但隨後有時我在packet.get()線一贈一BufferUnderflowException。我怎樣才能防止這個?

回答

0

我不相信我沒有趕上這一點。 debugPacket(packet)之後,我忘記了撥打packet.clear()

+0

除非您知道完全使用緩衝區,否則您應該調用'packet.compact()',而不是'packet.clear()'。 – EJP