1
こんにちは私は、既存のライブラリを使用せずにjavaを使用して独自のDNSクライアントを構築する必要がある学校の課題を行っています。 回答を解析する方法を理解しましたが、回答セクションに複数のレコードがあるとエラーが発生します。複数の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が見つかりません