Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在delphi中使用indy查找dns记录_Dns_Indy - Fatal编程技术网

如何在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

如何在Delphi中使用Indy查找DNS记录?例如,
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类型时设计注意事项的进一步讨论