我正在尝试使用硬编码的AName、在Delphi10.1更新2上使用JNI的一些代码和TIdDNSResolver来执行以下操作:
1)从设备接口配置(works!)获取设备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不正确,但是找不到关于如何正确使用的文档。谁(雷米?)请解释一下怎么做的?
谢谢。
发布于 2016-11-17 05:27:51
TIdDNSResolver不对qtDName响应记录使用TTextRecord。TTextRecord只用于qtTXT和qtHINFO记录(THINFORecord从TTextRecord派生)。
查看TIdDNSResolver的源代码,我发现DNAME实际上是一种未处理的响应类型(我不知道为什么),因此TIdDNSResolver将像对DNAME记录一样使用TResultRecord类。正因为如此,DNAME记录数据将根本不会被解析,r.RecType也不会像您所期望的那样成为qtDName (从技术上讲,它实际上是未赋值的,默认为0,这恰好是qtA)。然而,原始的答案数据至少将在r.RData中。
请注意,DNAME查找可能导致CNAME响应记录(包括其他记录)。CNAME记录在QueryResult中表示为TNAMERecord对象,其中r.RecType将是qtName。
我有签入修补程序 (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;https://stackoverflow.com/questions/40645064
复制相似问题