我正在尝试使用硬编码的AName,在Delphi 10.1 update 2上使用JNI的一些代码,以及TIdDNSResolver执行以下操作:
1)从设备接口配置中获取设备DNS服务器(正常工作!)
2)在DNS服务器上执行查找以检索该服务器的域名(失败!)
3)将DNS域附加到硬编码的AName(尚未存在)
4)使用FQDN AName查找服务器IP地址(尚未存在)
到目前为止,在Delphi中使用JNI函数我可以获得DNS服务器的IP地址。当我尝试查找域名时,我失败了。这是我的代码:
dns.Host := s;
dns.WaitingTime := 2048;
dns.QueryType := [qtDName];
dns.Resolve('hard_coded_server_name');
for i := 0 to Pred(dns.QueryResult.Count) do
begin
r := dns.QueryResult[i];
case r.RecType of
qtDName: begin
txt := TTextRecord(r);
Memo1.Lines.AddStrings(txt.Text);
end;
end;
end;
我确定我错误地使用了TResultRecord,但找不到有关如何正确执行此操作的文档。有人(雷米?)请解释一下如何做到这一点?
感谢。
答案 0 :(得分:2)
TIdDNSResolver
不会将TTextRecord
用于qtDName
响应记录。 TTextRecord
仅用于qtTXT
和qtHINFO
条记录(THINFORecord
来自TTextRecord
)。
查看TIdDNSResolver
的源代码,我发现DNAME
实际上是未处理的响应类型(我不知道为什么),所以TIdDNSResolver
将最终使用TResultRecord
类作为DNAME
记录的原样。因此,DNAME
记录数据根本不会被解析,r.RecType
将不会像您期望的那样qtDName
(从技术上讲,它实际上是未分配的,默认为0,恰好是qtA
)。但是,原始答案数据至少会在r.RData
。
请注意,DNAME
查找可能会产生CNAME
响应记录(以及其他记录)。 CNAME
个记录在QueryResult
中表示为TNAMERecord
个对象,其中r.RecType
将为qtName
。
我有checked in a fix(SVN rev 5377):
TDNAMERecord
类来解析DNAME
数据。TResultRecord.RecType
属性分配了已知记录类型的值(即使它们未被解析)。TResultRecord.TypeCode
属性,无法在TResultRecord.RecType
属性中表示。例如:
dns.Host := s;
dns.WaitingTime := 2048;
dns.QueryType := [qtDName];
dns.Resolve('hard_coded_server_name');
for i := 0 to Pred(dns.QueryResult.Count) do
begin
r := dns.QueryResult[i];
case r.RecType of
qtName: begin
Memo1.Lines.Add('CNAME: ' + TNAMERecord(r).HostName);
end;
qtDName: begin
Memo1.Lines.Add('DNAME: ' + TDNAMERecord(r).HostName);
end;
// other types as needed ...
else
Memo1.Lines.Add(IntToStr(r.TypeCode) + ': ' + ToHex(r.RData));
end;
end;