Используйте Indy для выполнения обратного поиска IPv6 DNS - PullRequest
4 голосов
/ 26 ноября 2011

Я использую 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 Ответ

3 голосов
/ 29 ноября 2011

Вам не нужно ничего делать.Для qtPTR запросов Resolve() автоматически определяет, является ли адрес IPv4 или IPv6, и соответствующим образом форматирует запрос.

...