Delphi 区分不同类型的EIdDnsResolverError

Delphi 区分不同类型的EIdDnsResolverError,delphi,dns,indy,Delphi,Dns,Indy,我正在使用TIdDNSResolver扫描本地网络中的DNS服务器,因此DNS请求的结果并不重要。我检查是否有DNS服务器 应用程序也不应该依赖于请求的DNS记录是否存在,因此它请求的不是一个存在的主机,而是一个故意不存在的名称 在这种情况下,将引发EIdDnsResolverError类型的异常 此异常可能伴随以下错误文本: TimedOut-这意味着DNS服务器没有及时响应,我们应该假设它不存在。 DNS服务器报告查询名称错误-DNS服务器存在 DNS服务器报告查询服务器错误-DNS服务器存

我正在使用TIdDNSResolver扫描本地网络中的DNS服务器,因此DNS请求的结果并不重要。我检查是否有DNS服务器

应用程序也不应该依赖于请求的DNS记录是否存在,因此它请求的不是一个存在的主机,而是一个故意不存在的名称

在这种情况下,将引发EIdDnsResolverError类型的异常

此异常可能伴随以下错误文本:

TimedOut-这意味着DNS服务器没有及时响应,我们应该假设它不存在。 DNS服务器报告查询名称错误-DNS服务器存在 DNS服务器报告查询服务器错误-DNS服务器存在 我不喜欢通过错误文本来区分这些错误。还有其他的区别方法吗

function TDNSChecker.CheckServer(host: string): Boolean;
var
  dr: TIdDNSResolver;
begin
  Result := False;
  try
    dr := TIdDNSResolver.Create(nil);
    try
      dr.Host := host;
      dr.QueryType := [qtA];
      dr.WaitingTime := 1000;
      dr.Resolve('feufgzrfapoduiuzgfuzfsufseuszfu'); //knowingly non-existent name
      Result := True;
    finally
      _finished := True;
      dr.Free();
    end;
  except
    on ex: EIdDnsResolverError do
      if ex.Message <> 'TimedOut' then begin
        if (ex.Message = 'DNS Server Reports Query Name Error') or (ex.Message = 'DNS Server Reports Query Server Error') then
          Result := True
        else
          Log(host + ' - ' + ex.ClassName + ': ' + ex.Message.Replace(#13#10, ' '));
      end;
    on ex: Exception do;
  end;
end;
不幸的是,TIdDNSResolver当前没有为不同的DNS错误使用不同的异常类类型,它只使用EIdDnsResolverError。我已经在Indy的问题跟踪程序中添加了可能在未来版本中添加更多的错误类

因此,同时,为了区分DNS错误,您必须查看异常的Message属性。可能的错误消息作为资源字符串存储在IdResourceStringsProtocols单元中。大约有21个字符串与DNS错误相关。请注意,其中一些是格式化字符串,因此简单的比较是不起作用的,您必须使用TextStartsWith或类似的东西来忽略任何格式化部分

另一方面,您得到的EIdDnsResolverError异常通常意味着您收到了来自DNS服务器的响应。您不需要区分每个可能的Indy DNS错误,就可以知道DNS服务器存在。只有少数EIdDnsResolverError错误与连接本身有关,例如RSDNSTimeout、RSTunnelConnectionToMasterFailed等,而不是与DNS消息的内容有关

如果您使用的是具有Exception.InnerException属性可用的Delphi版本,则只有当QueryType中存在qtAXFR或qtIXFR而不是UDP时,当TIdDNSResolver使用TCP时,InnerException可能会设置为EIdConnectTimeout或EIdConnectException。InnerException也可能是EIdNotEnoughData,但这可能是消息传递错误,而不是连接错误


在您的示例中,将使用UDP,因此我认为除了RSDNSTimeout之外的任何EIdDNSResolverError错误都将表明存在DNS服务器。

对于现有的Indy代码,否:无法进行区分