2013-03-30 3 views
2

Я не могу найти простые примеры поиска DNS, используя компонент Indy 10 TIdDNSResolver. Они все либо для чего-то мне не нужны (например, 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

Вам нужно будет придумать элемент коллекции QueryResult конкретному потоку TResultRecord в зависимости от значения свойства RecType элемента. Из ссылки на 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; 

Примеры функций для DNS-поиска IPv4 и IPv6 вы можете find here.

+0

Это похоже на метод, который должен быть встроен в тип записи QueryResult. ('AddressAsString()') –

+0

@ Уоррен, я не думаю, что это было бы полезно, поскольку только несколько ['записей DNS'] (http://en.wikipedia.org/wiki/List_of_DNS_record_types) содержат поле адреса. – TLama

+2

Хм. Мне действительно не нравится контейнер-объект-требующий-литой-для-использования.Как заметил Джерри, это вряд ли удобный API. –