【问题标题】:Reading response from TIdDNSResolver?从 TIdDNSResolver 读取响应?
【发布时间】:2013-03-30 22:33:57
【问题描述】:

我找不到任何使用 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');

如何阅读此回复?

【问题讨论】:

  • 也许[这个问题] 会有所帮助? (通过在[indy] TIdDNSResolver 上搜索找到)。它询问有关转换以支持 Ipv6,但显示使用反向 DNS 查找的返回值。不知道会不会有帮助,但是...
  • @Ken 什么问题?您的评论中没有链接...
  • 为什么不试试这个呢? delphidabbler.com/tips/25
  • 啊!当我这样做时,我讨厌它! :-) stackoverflow.com/q/8277903/62576 - 这就是问题本身(参见代码的下半部分)。
  • @WarrenP 确实很简单(只是因为已经为我编写了代码)但我已经在使用 Indy,我相信一旦通过了这个障碍,它会比使用 Winsock 容易得多直接。

标签: delphi dns delphi-xe2 indy indy10


【解决方案1】:

您需要根据项目的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 查找的示例函数。

【讨论】:

  • 这似乎是一个应该内置到 QueryResult 记录类型中的方法。 (AddressAsString())
  • @Warren,我认为这不会有帮助,因为只有几个 DNS records 包含地址字段。
  • 嗯。我真的不喜欢需要使用的对象容器。正如 Jerry 所发现的,这几乎不是一个用户友好的 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2013-09-09
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多