【问题标题】:Delphi / Indy resolve DNS domain by host name lookupDelphi / Indy 通过主机名查找解析 DNS 域
【发布时间】:2016-11-17 01:03:06
【问题描述】:

我正在尝试使用硬编码的 AName、在 Delphi 10.1 更新 2 上使用 JNI 的一些代码以及 TIdDNSResolver 来执行以下操作:

1) 从设备接口配置中获取设备 DNS 服务器(有效!)

2) 在 DNS 服务器上查找以检索该服务器的域名(失败!)

3) 将 DNS 域附加到硬编码的 AName(尚不存在)

4) 使用 FQDN AName 查找服务器 IP 地址(还没有)

到目前为止,在 Delphi 中使用 JNI 函数我可以获得 DNS 服务器的 IP 地址。当我尝试查找域名时,我失败了。这是我的代码:

dns.Host := s;
dns.WaitingTime := 2048;
dns.QueryType := [qtDName];
dns.Resolve('hard_coded_server_name');
for i := 0 to Pred(dns.QueryResult.Count) do
begin
  r := dns.QueryResult[i];
  case r.RecType of
    qtDName:  begin
                txt := TTextRecord(r);
                Memo1.Lines.AddStrings(txt.Text);
              end;
  end;
end;

我确定我错误地使用了 TResultRecord,但找不到有关如何正确执行此操作的文档。有人(雷米?)可以解释一下如何做到这一点吗?

谢谢。

【问题讨论】:

    标签: delphi dns indy10


    【解决方案1】:

    TIdDNSResolver 不将TTextRecord 用于qtDName 响应记录。 TTextRecord 仅用于 qtTXTqtHINFO 记录(THINFORecord 派生自 TTextRecord)。

    查看TIdDNSResolver的源代码,我看到DNAME实际上是一个未处理响应类型(我不知道为什么),所以TIdDNSResolver最终会使用@ 987654333@ 类为DNAME 记录。正因为如此,DNAME 记录数据根本不会被解析,r.RecType 不会像你期望的那样是qtDName(从技术上讲,它实际上是未分配的,默认为 0,恰好是 @987654338 @)。但是,原始答案数据至少会在r.RData 中。

    请注意,DNAME 查找可能会导致 CNAME 响应记录(以及其他)。 CNAME 记录在QueryResult 中表示为TNAMERecord 对象,其中r.RecType 将是qtName

    我有checked in a fix(SVN rev 5377):

    • 添加了一个新的TDNAMERecord 类来解析DNAME 数据。
    • 确保为TResultRecord.RecType 属性分配了已知记录类型的值(即使它们没有被解析)。
    • 为无法在 TResultRecord.RecType 属性中表达的未知记录类型添加了新的 TResultRecord.TypeCode 属性。

    例如:

    dns.Host := s;
    dns.WaitingTime := 2048;
    dns.QueryType := [qtDName];
    dns.Resolve('hard_coded_server_name');
    for i := 0 to Pred(dns.QueryResult.Count) do
    begin
      r := dns.QueryResult[i];
      case r.RecType of
        qtName: begin
          Memo1.Lines.Add('CNAME: ' + TNAMERecord(r).HostName);
        end;
        qtDName: begin
          Memo1.Lines.Add('DNAME: ' + TDNAMERecord(r).HostName);
        end;
        // other types as needed ...
      else
        Memo1.Lines.Add(IntToStr(r.TypeCode) + ': ' + ToHex(r.RData));
      end;
    end;
    

    【讨论】:

    • 你摇滚。 :-) \m/
    • 非常感谢!只是为了确保我理解,这个新的 TDNAMERecord 提供了一个提供 DNS 域名的字段?还是我需要解析 .HostName?
    • @DeCoder HostName 域名。
    • 我注意到修订版 5377 似乎与您的代码示例不一致的一件事是 qtCName 值尚未在 TQueryRecordTypes 枚举类型中定义,即使已定义 TCNAMERecord .这是疏忽吗?还是我错过了什么?
    • @DeCoder:这是我的错字,应该是 qtName 而不是 qtCName。我已经纠正了这个例子。没有TCNAMERecord 类,而是有TNAMERecord,这是qtName 使用的。
    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 2019-02-06
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多