【问题标题】:Use Indy to perform an IPv6 reverse DNS lookup使用 Indy 执行 IPv6 反向 DNS 查找
【发布时间】:2012-01-06 20:28:33
【问题描述】:

我正在使用 Indy 使用以下代码执行反向 IPv4 查找。

function ReverseDNSLookup(const IPAddress: String; const DNSServer: String; Timeout, Retries: Integer; var HostName: String): Boolean;
var
  AIdDNSResolver: TIdDNSResolver;
  RetryCount: Integer;
begin
  Result := FALSE;

  AIdDNSResolver := TIdDNSResolver.Create(nil);
  try
    AIdDNSResolver.QueryResult.Clear;
    AIdDNSResolver.WaitingTime := Timeout; 
    AIdDNSResolver.QueryType := [qtPTR];
    AIdDNSResolver.Host := DNSServer;

    RetryCount := Retries;
    repeat
      try
        dec(RetryCount);

        AIdDNSResolver.Resolve(IPAddress);

        Break;
      except
        on e: Exception do
        begin
          if RetryCount <= 0 then
          begin
            if SameText(e.Message, RSCodeQueryName) then
              Result := FALSE
            else
              raise Exception.Create(e.Message);

            Break;
          end;
        end;
      end;
    until FALSE;

    Result := AIdDNSResolver.QueryResult.Count > 0;

    if Result then
    begin
      Result := TRUE;
      HostName := ParseReverseDNSResult(AIdDNSResolver.QueryResult[0].RData);
    end;
  finally
    FreeAndNil(AIdDNSResolver);
  end;
end;

为了使其与 IPv6 兼容,我需要进行哪些更改?

我知道我可以使用 getaddrinfo,但在这种特殊情况下,我需要直接联系 DNS 服务器。

【问题讨论】:

  • indy 10 从 2006 年开始使用解析器组件以本机格式支持 ip v6,根据 indy 更改日志。当您针对 ipv6 主机名测试上述代码时会发生什么?
  • @Warrent - 你是对的。我错误地认为您在调用解析时需要设置一些属性。查看 Indy 源,我现在看到它会检查地址类型,然后在将域发送到服务器之前适当地格式化域。如果您发表评论作为答案,我会接受。
  • 你能告诉我关于 ParseReverseDNSResult 函数的任何信息吗?

标签: delphi dns delphi-2010 ipv6 indy


【解决方案1】:

你不需要做任何事情。对于qtPTR 查询,Resolve() 会自动检测地址是 IPv4 还是 IPv6,并相应地格式化查询。

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2020-03-08
    • 1970-01-01
    • 2016-09-24
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多