2016-11-17 82 views
1

我试图用一个硬编码AName,德尔福10.1更新2,和TIdDNSResolver使用JNI一些代码来执行以下操作:德尔福/印解析DNS的主机名查找域名

1)获取设备DNS服务器(S)从设备接口的配置(作品!)

2)你的DNS服务器上的查询检索服务器的域名(失败!)

3)追加DNS域的硬编码AName (还没有)

4)使用FQDN AName来查找e服务器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,但无法找到如何正确地做到这一点的文档。可能有人(雷米?)请解释如何做到这一点?

谢谢。

回答

2

TIdDNSResolver不使用TTextRecordqtDName响应记录。 TTextRecord仅用于qtTXTqtHINFO记录(THINFORecord来自TTextRecord)。

看着为TIdDNSResolver的源代码,我看到DNAME实际上是一个未处理响应类型(我不知道为什么),所以TIdDNSResolver最终会使用TResultRecord类,用于开发DNAME记录。因此,DNAME记录数据根本不会被解析,并且r.RecType不会像您所期待的那样(从技术上讲,它实际上会被取消分配并且默认为0,恰好是qtA),因此r.RecType不会被解析为qtDName。但是,原始答案数据至少在r.RData

请注意,DNAME查找可能导致CNAME响应记录(等等)。 CNAME记录代表QueryResultTNAMERecord对象,其中r.RecType将为qtName

我有checked in a fix(SVN修订版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; 
+0

你的岩石。 :-) \ m/ –

+0

非常感谢!为了确保我理解,这个新的TDNAMERecord提供了一个提供DNS域名的字段?或者我需要解析.HostName? – DeCoder

+0

@DeCoder'HostName' *是域名。 –