阅读TIdDNSResolver的回复?

时间:2013-03-30 22:33:58

标签: delphi dns delphi-xe2 indy indy10

我找不到使用Indy 10的TIdDNSResolver组件进行DNS查找的任何简单示例。它们都是我不需要的东西(例如MX / SMTP),或者说条款没有代码。我已经尝试根据我能找到的少量资源阅读结果,但不知道我应该如何阅读结果。

这是我到目前为止所拥有的......

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');

我如何阅读此回复?

1 个答案:

答案 0 :(得分: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;

您可以find here进行IPv4和IPv6 DNS查找的示例功能。