阅读TIdDNSResolver的回复?

Jer*_*dge 2 delphi dns indy indy10 delphi-xe2

我找不到任何使用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;
Run Code Online (Sandbox Code Playgroud)

用法...

HostIP:= Lookup('www.google.com');
Run Code Online (Sandbox Code Playgroud)

我如何阅读此回复?

TLa*_*ama 8

您需要根据QueryResult项目TResultRecordRecType属性值将集合项目类型转换为特定的后代.从Items物业参考:

使用强制转换返回一个对象引用,该对象引用允许访问与TResultRecord.RecType中的值关联的子类所特有的任何属性或方法.

TResultRecord后代类的名称模式是这样的:

T<DNS lookup type>Record
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,它看起来像这样:

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;
Run Code Online (Sandbox Code Playgroud)

对于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;
Run Code Online (Sandbox Code Playgroud)

您可以使用IPv4和IPv6 DNS查找的示例函数find here.

  • 嗯.我真的不喜欢需要使用的物体容器.正如Jerry所发现的,这不是一个用户友好的API. (2认同)