norgepaul
norgepaul

Reputation: 6053

Use Indy to perform an IPv6 reverse DNS lookup

I am using Indy to perform a reverse IPv4 lookup using the following code.

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;

What do I need to change in order to make it compatible with IPv6?

I know I can use getaddrinfo, but in this particular case I need to contact the DNS server directly.

Upvotes: 4

Views: 2214

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 598011

You don't have to do anything. For qtPTR queries, Resolve() automatically detects whether the address is IPv4 or IPv6 and formats the query accordingly.

Upvotes: 3

Related Questions