代码之家  ›  专栏  ›  技术社区  ›  Paul

区分不同种类的EIDDNSResolverError

  •  0
  • Paul  · 技术社区  · 5 年前

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

    应用程序也不应该依赖于请求的DNS记录的存在性,因此它不应该请求一个已知的不存在的名称,而应该请求一个存在的主机。

    在这种情况下, EIdDnsResolverError 正在引发类型。

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

    • 延期付款 -这意味着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 回复  |  直到 5 年前
        1
  •  1
  •   Remy Lebeau    5 年前

    不幸的是, TIdDNSResolver 对于不同的DNS错误,当前不使用不同的异常类类型,它只使用 EIdDnsResolverError . 我有 opened a ticket 在Indy的问题跟踪器中,可以在未来的版本中添加更多的错误类。

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

    另一方面,你得到的事实是 EIDDNSREsolverer错误 任何情况下都有例外 通常 意味着您收到来自DNS服务器的响应。您不需要区分每一个可能的indy-dns错误,就可以知道存在一个dns服务器。只有少数 EIDDNSREsolverer错误 错误与连接本身相关,例如 RSDNSTimeout , RSTunnelConnectToMasterFailed ,而不是发送到DNS消息的内容。

    如果您使用的Delphi版本 Exception.InnerException 属性可用,然后 InnerException 可以设置为 EIdConnectTimeout EIdConnectException 什么时候? 终端解析器 使用TCP(仅当 qtAXFR qtIXFR 存在于 QueryType )而不是UDP。也有可能 内部例外 可能是 EIdNotEnoughData ,但这将是一个消息传递错误,而不是连接错误。

    在您的示例中,将使用udp,因此我只考虑 EIdDNSResolverError 错误,除了 RSDnistMeMeOUT 表示存在DNS服务器。