区分不同类型的EIdDnsResolverError

时间:2019-01-08 10:59:18

标签: delphi dns indy

我正在使用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;

1 个答案:

答案 0 :(得分:1)

不幸的是,header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization,Access-Control-Request-Method, Access-Control-Request-Headers, authId'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); 当前未针对不同的DNS错误使用不同的异常类类型,而仅使用TIdDNSResolver。我在Indy的问题跟踪器中有opened a ticket,可以在以后的版本中添加更多错误类。

因此,在此期间,要区分DNS错误,您将不得不查看异常的EIdDnsResolverError属性。可能的错误消息作为资源字符串存储在Message单元中(大约有21个与DNS错误相关的字符串)。请注意,其中一些是格式化的字符串,因此按原样进行简单比较是行不通的,您将不得不使用类似IdResourceStringsProtocols之类的东西来忽略任何格式化部分。

另一方面,您通常会收到TextStartsWith()异常的事实通常表示您收到了来自DNS服务器的响应。您无需区分每个可能的Indy DNS错误即可知道存在DNS服务器。只有少数EIdDnsResolverError错误与连接本身有关,例如EIdDnsResolverErrorRSDNSTimeout等,而不是与DNS消息传递的内容有关。

如果您使用的是具有RSTunnelConnectToMasterFailed属性的Delphi版本,则Exception.InnerExceptionInnerException可以设置为EIdConnectTimeoutEIdConnectException使用TCP(仅当TIdDNSResolver中存在qtAXFRqtIXFR时才使用UDP)。 QueryType也可能是InnerException,但这可能是消息传递错误,而不是连接错误。

在您的示例中,将使用UDP,所以我认为除EIdNotEnoughData以外的任何EIdDNSResolverError错误都表明存在DNS服务器。