使用Indy执行IPv6反向DNS查找

4

我正在使用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服务器。


1
根据indy的更新日志,自2006年起,indy 10已经通过resolver组件以其原生格式支持IPv6。当您对一个IPv6主机名进行上述代码测试时会发生什么? - Warren P
2
@Warrent - 你是正确的。我错误地假设在调用解析时需要设置某些属性。现在看 Indy 源代码,我发现它会检查地址类型,然后在将其发送到服务器之前适当地格式化域名。如果您将您的评论发布为答案,我会接受它。 - norgepaul
你能告诉我关于ParseReverseDNSResult函数的任何信息吗? - Alex Egorov
1个回答

3

您无需进行任何操作。对于qtPTR查询,Resolve()会自动检测地址是IPv4还是IPv6,并相应地格式化查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接