我正在使用TIdDNSResolver
扫描本地网络中的DNS服务器,因此DNS请求的结果并不重要。我检查一下是否有DNS服务器。
该应用程序也不应依赖于所请求的DNS记录的存在,因此它会请求一个已知不存在的名称,而不是一个不存在的主机。
在这种情况下,将引发EIdDnsResolverError
类型的异常。
此异常可能伴随以下错误文本:
我不喜欢通过错误文本来区分这些错误。还有其他区分方法吗?
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;
答案 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
错误与连接本身有关,例如EIdDnsResolverError
,RSDNSTimeout
等,而不是与DNS消息传递的内容有关。
如果您使用的是具有RSTunnelConnectToMasterFailed
属性的Delphi版本,则Exception.InnerException
时InnerException
可以设置为EIdConnectTimeout
或EIdConnectException
使用TCP(仅当TIdDNSResolver
中存在qtAXFR
或qtIXFR
时才使用UDP)。 QueryType
也可能是InnerException
,但这可能是消息传递错误,而不是连接错误。
在您的示例中,将使用UDP,所以我认为除EIdNotEnoughData
以外的任何EIdDNSResolverError
错误都表明存在DNS服务器。