我使用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服务器。
答案 0 :(得分:3)
您无需做任何事情。对于qtPTR
个查询,Resolve()
会自动检测地址是IPv4还是IPv6,并相应地格式化查询。