2016-11-17 104 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' *是域名。 –