2017-10-17 48 views
1

你好我正在为学校做一项任务,它需要你使用java构建你自己的DNS CLient,而不使用任何现有的库。 我想出了如何解析响应,但在Answer部分有多个记录时出现错误。当存在多个NS记录时解析dns响应

public void processResponse(DatagramPacket packet) throws IOException{ 
    DataInputStream din = new DataInputStream(new ByteArrayInputStream(packet.getData())); 
    din.readShort(); //Transaction ID 
    din.readShort(); //Flags 

    int questions = din.readShort(); 
    int answers = din.readShort(); 
    int authorities = din.readShort(); 
    int additional = din.readShort(); 
    int recLen = 0; 
    while ((recLen = din.readByte()) > 0) { 
     for (int i = 0; i < recLen; i++) { 
      din.readByte(); 
     } 
    } 
    din.readShort(); // Record type for question 
    din.readShort(); // Class for question 

    //ANSWERS 
    //Just looping for one answer here 
    for(int i=0;i<1;i++){ 
     din.readShort(); // Record name for Answer 
     String response = ""; 
     int typeOfRec = din.readShort(); 
     din.readShort(); // Class for answers 
     int ttl = din.readInt(); 
     short resLength = din.readShort(); 
     switch(typeOfRec){ 
     //A 
     case 1:{ 
      response+="IP\t"; 
      String ip = ""; 
      for (int j = 0; j < resLength; j++) { 
       ip+=("" + String.format("%d", (din.readByte() & 0xFF)) + "."); 
      } 

      response+=ip+"\t"+ttl; 
      System.out.println(response); 
      break; 
     } 
     //NS 
     case 2:{ 
      String ip = ""; 
      response+="NS\t"; 
      while ((recLen = din.readByte()) > 0) { 
       byte[] record = new byte[recLen]; 

       for (int j = 0; j < recLen; j++) { 
        record[j] = din.readByte(); 
       } 

       ip+=new String(record, "UTF-8"); 
       ip+="."; 
      } 
      response+=ip+"\t"+ttl; 
      System.out.println(response); 
      break; 
     } 
     //CNAME 
     case 5:{ 
      response+="CNAME\t"; 
      break; 
     } 
     //MX 
     case 15:{ 
      response+="MX\t"; 
      break; 
     } 
     default:{ 
      break; 
     } 
     } 
    }   
} 

这是最终处理响应数据包以获取所需数据的函数。但是,当我运行此代码时,响应仅为 NS ns-358.awsdns-44。 86399 .com缺失

回答

0

看起来您需要了解名称如何以DNS线格式进行编码。特别是他们如何被压缩。 RFC 1035的4.1.4节将是一个很好的开始。