我被分配了一个关于用Java编写迭代DNS客户端的项目,该客户端可以在A,NS和MX寄存器中执行查询,我们获得了一个API来处理我们的DNS数据包所以我们只需要关注程序的迭代性质加上它的逻辑
我的问题发生在我尝试执行NS查询时,我可以完全正常从根服务器到权威的一个并获得答案数据包,但是当我在终端中显示它时会发生这种情况(我只显示最后一个查询): terminal output
我不知道为什么会这样,但是检查wireshark,数据包看起来很好,数据包的解析是在他们的API中完成的,但我的教授拒绝帮助我,我在这里提供一些代码: 我的代码(我在哪里显示答案)
if (!answers.isEmpty()) {
for (int i = 0; i < answers.size(); i++) {
NSResourceRecord nsRec = new NSResourceRecord(answers.get(i).getDomain(), answers.get(i).getTTL(),
new DomainName(answers.get(i).getRRData(), msg_in.toByteArray())); // <-- The problem is here
System.out.println("A: " + serverDNS + " " + RRType.NS +
" " + nsRec.getTTL() + " "
+ nsRec.getNS());
}
API的解析部分:
public DomainName(byte[] domain, byte[] message) {
fromByteArray(domain, message);
}
@Override
public String toString() {
String res = "";
return labels.stream().map((label) -> label + '.').reduce(res, String::concat);
}
private void fromByteArray(final byte[] domain, final byte[] message) {
int i = 0;
while (i < domain.length) {
int size = (domain[i++] & 0xff);
if (size == 0) {
break;
}
if ((size & 0xc0) == 0xc0) { // Pointer
int offset = (domain[i++] & 0xff) + ((size & 0x3f) << 8);
setEncodedLength(i);
fromByteArray(Arrays.copyOfRange(message, offset, message.length), message);
return;
}
String label = new String(Arrays.copyOfRange(domain, i, i + size), ASCII);
i += size;
labels.add(label);
}
setEncodedLength(i);
}
另一件事:在某些服务器(例如NS google.com)中工作得非常好,在其他服务器中只有一些时间 谢谢你的帮助!