2013-03-30 48 views
2

我找不到任何使用Indy 10的TIdDNSResolver組件的DNS查找的簡單示例。他們都是爲我不需要的東西(比如MX/SMTP),或者正在談論條款而沒有代碼。我試着根據我可以找到的少量資源閱讀結果,但不知道我應該如何閱讀結果。閱讀來自TIdDNSResolver的迴應?

這裏是我迄今爲止...

uses 
    IdBaseComponent, IdComponent, IdTCPConnection, IdDNSResolver; 

function TForm1.Lookup(const Name: String): String; 
var 
    X: Integer; 
begin 
    //DNS: TIdDNSResolver 
    DNS.QueryType:= [qtA]; 
    DNS.Resolve(Name); 
    for X:= 0 to DNS.QueryResult.Count-1 do begin 
    if DNS.QueryResult[X].RecType = qtA then 
     //Result:= DNS.QueryResult[X].RData; <--- ???? 
    end; 
end; 

使用...

HostIP:= Lookup('www.google.com'); 

如何閱讀對此有何反應?

+0

也許[這個問題]會有幫助嗎? (通過在這裏搜索'[indy] TIdDNSResolver''找到)。它詢問如何轉換爲支持Ipv6,但使用反向DNS查找的返回值顯示。不知道它是否會有所幫助,但... –

+0

@Ken有什麼問題嗎?在評論中沒有鏈接... –

+0

爲什麼不試試這個呢? http://www.delphidabbler.com/tips/25 –

回答

8

根據項目的RecType屬性值,您需要將QueryResult收集項目轉換爲特定的TResultRecord後代。從Items屬性參考:

使用鑄造返回對象引用,允許訪問任何 屬性或方法專用於與在 TResultRecord.RecType該值相關的子類。

TResultRecord子孫類的名稱模式是這樣的:

T<DNS lookup type>Record 

因此,在你的情況是這樣的:

for X := 0 to DNS.QueryResult.Count - 1 do 
begin 
    if DNS.QueryResult[X].RecType = qtA then 
    Result := TARecord(DNS.QueryResult[X]).IPAddress; // "A" lookup -> TARecord 
end; 

對於AAAA查找類型這將是:

for X := 0 to DNS.QueryResult.Count - 1 do 
begin 
    if DNS.QueryResult[X].RecType = qtAAAA then 
    Result := TAAAARecord(DNS.QueryResult[X]).Address; // "AAAA" lookup -> TAAAARecord 
end; 

可以使用find here的IPv4和IPv6 DNS查找示例功能。

+0

這看起來像應該內置到QueryResult記錄類型中的一種方法。 ('AddressAsString()') –

+0

@Warren,我認爲這不會有幫助,因爲只有幾個['DNS記錄'](http://en.wikipedia.org/wiki/List_of_DNS_record_types)包含地址字段。 – TLama

+2

嗯。我真的不喜歡容器對象需要使用的模型。正如傑瑞發現的那樣,這幾乎不是用戶友好的API。 –