如何在delphi中使用indy查找dns记录
如何在Delphi中使用Indy查找DNS记录?例如,如何在delphi中使用indy查找dns记录,dns,indy,Dns,Indy,如何在Delphi中使用Indy查找DNS记录?例如,SRV记录,SPF记录,TEXT记录等 我知道我们可以直接从Windows使用nslookup,但我想用Indy或任何其他Delphi组件来实现这一点 我试着在谷歌上搜索,发现了这样的东西: function ReverseDNSLookup(IPAddress: String; DNSServer: String = SDefaultDNS; Timeout: Integer = 30; Retries: Integer = 3) : st
SRV
记录,SPF
记录,TEXT
记录等
我知道我们可以直接从Windows使用nslookup
,但我想用Indy或任何其他Delphi组件来实现这一点
我试着在谷歌上搜索,发现了这样的东西:
function ReverseDNSLookup(IPAddress: String; DNSServer: String =
SDefaultDNS; Timeout: Integer = 30; Retries: Integer = 3) : string;
var
AIdDNSResolver: TIdDNSResolver;
RetryCount: Integer;
begin
Result := '';
IPAddress := ReverseIP(IPAddress);
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;
if AIdDNSResolver.QueryResult.Count > 0 then
Result := AIdDNSResolver.QueryResult.DomainName;
finally
FreeAndNil(AIdDNSResolver);
end;
end;
函数反向nslookup(IPAddress:String;DNSServer:String)=
SDefaultDNS;超时:整数=30;重试次数:整数=3):字符串;
变量
AIdDNSResolver:TIdDNSResolver;
RetryCount:整数;
开始
结果:='';
IPAddress:=反向IP(IPAddress);
AIdDNSResolver:=TIdDNSResolver.Create(无);
尝试
AIdDNSResolver.QueryResult.Clear;
AIdDNSResolver.WaitingTime:=超时;
AIdDNSResolver.QueryType:=[qtPTR];
AIdDNSResolver.Host:=DNSServer;
RetryCount:=重试次数;
重复
尝试
dec(RetryCount);
AIdDNSResolver.Resolve(IPAddress);
打破
除了
关于e:Exception-do
开始
如果RetryCount为0,则
结果:=AIdDNSResolver.QueryResult.DomainName;
最后
FreeAndNil(AIdDNSResolver);
结束;
结束;
但它所做的只是查找IP地址。我想要
SRV
和TEXT
记录,也许还有SPF
记录。TIdDNSResolver
就是您要找的。您展示的示例仅使用TIdDNSResolver
支持的一小部分。您只需设置TIdDNSResolver.QueryType
属性来指定要查询的记录的类型,然后通过TIdDNSResolver.QueryResult
集合循环访问各个记录TIdDNSResolver
支持SRV
和TXT
记录,例如:
var
DNS: TIdDNSResolver;
I: Integer;
Record: TResultRecord;
Txt: TTextRecord;
Srv: TSRVRecord;
begin
DNS := TIdDNSResolver.Create(nil);
try
DNS.WaitingTime := Timeout;
DNS.QueryType := [qtTXT, qtService];
DNS.Host := 'some.dns.server';
DNS.Resolve('some.hostname');
for I := 0 to DNS.QueryResult.Count -1 do
begin
Record := DNS.QueryResult[I];
case Record.RecType of
begin
qtTXT: begin
Txt := TTextRecord(Record);
// use Txt.Text as needed...
end;
qtService: begin
Srv := TSRVRecord(Record);
// use Srv.OriginalName, Srv.Service, Srv.Protocol, etc as needed...
end;
else
// something else...
end;
end;
finally
DNS.Free;
end;
end;
TIdDNSResolver
不支持2006年定义的SPF
记录类型(代码99):
本文档定义了SPF类型的新DNS RR,代码99。此类型的格式与TXT RR[RFC1035]相同。对于任何一种类型,记录的字符内容都编码为[US-ASCII]
目前的做法(使用TXT记录)并非最佳做法,但这是必要的,因为有许多常见的DNS服务器和解析器实现无法处理新的RR类型。双记录类型方案提供了一个前进路径,以更好地解决使用为此目的保留的RR类型的问题
该记录类型后来在2014年被淘汰:
SPF记录必须仅作为DNS TXT(类型16)资源记录(RR)[RFC1035]发布。记录的字符内容编码为[US-ASCII]。SPF的实验阶段支持使用替代DNS RR类型,但已停止使用
2003年,当SPF首次开发时,分配新DNS RR类型的要求比现在严格得多。此外,DNS服务器和资源调配系统中没有广泛部署支持轻松部署新的DNS RR类型。因此,SPF的开发人员发现对SPF记录使用TXT RR类型更容易、更实用
在对[RFC4408]的审查中,SPFbis工作组得出结论,其双RR类型转换模型存在根本性缺陷,因为它不包含要求实施者服务和检查的通用RR类型。考虑了许多替代方案来解决此问题,但工作组最终得出结论,在可预见的未来,不太可能大量迁移到SPF RR类型,解决此互操作性问题的最佳解决方案是从SPF版本1中放弃对SPF RR类型的支持。更多信息,请参见[RFC6686]的附录A
十年前SPF最初部署的环境是独一无二的。如果开发的SPF未来更新不重用现有SPF记录,则可以使用SPF RR类型。SPF对结构化数据使用TXT RR类型决不能作为未来协议设计者的先例。在[RFC5507]中可以找到关于使用新DNS RR类型时设计注意事项的进一步讨论