我找不到使用Indy 10的TIdDNSResolver
组件进行DNS查找的任何简单示例。它们都是我不需要的东西(例如MX / SMTP),或者说条款没有代码。我已经尝试根据我能找到的少量资源阅读结果,但不知道我应该如何阅读结果。
这是我到目前为止所拥有的......
uses
IdBaseComponent, IdComponent, IdTCPConnection, IdDNSResolver;
function TForm1.Lookup(const Name: String): String;
var
X: Integer;
begin
//DNS: TIdDNSResolver
DNS.QueryType:= [qtA];
DNS.Resolve(Name);
for X:= 0 to DNS.QueryResult.Count-1 do begin
if DNS.QueryResult[X].RecType = qtA then
//Result:= DNS.QueryResult[X].RData; <--- ????
end;
end;
...使用
HostIP:= Lookup('www.google.com');
我如何阅读此回复?
答案 0 :(得分:8)
您需要将QueryResult
集合项类型转换为特定的TResultRecord
后代,具体取决于项目的RecType
属性值。来自Items
属性引用:
使用强制转换返回允许访问任何对象的对象引用 特定于与之关联的后代类的属性或方法 TResultRecord.RecType中的值。
TResultRecord
后代类的名称模式如下:
T<DNS lookup type>Record
所以在你的情况下,它看起来像这样:
for X := 0 to DNS.QueryResult.Count - 1 do
begin
if DNS.QueryResult[X].RecType = qtA then
Result := TARecord(DNS.QueryResult[X]).IPAddress; // "A" lookup -> TARecord
end;
对于AAAA
查找类型,它将是:
for X := 0 to DNS.QueryResult.Count - 1 do
begin
if DNS.QueryResult[X].RecType = qtAAAA then
Result := TAAAARecord(DNS.QueryResult[X]).Address; // "AAAA" lookup -> TAAAARecord
end;
您可以find here
进行IPv4和IPv6 DNS查找的示例功能。