我無法在文檔中找到任何適當的描述,以瞭解它實際的功能。Dns.GetHostEntry方法(String)實際上做了什麼?
它檢查是否存在A記錄或CNAME記錄或兩者?
我的理解是,在.NET 4中,如果主機不存在,則會拋出一個SocketException,這由我的測試證實。
我無法在文檔中找到任何適當的描述,以瞭解它實際的功能。Dns.GetHostEntry方法(String)實際上做了什麼?
它檢查是否存在A記錄或CNAME記錄或兩者?
我的理解是,在.NET 4中,如果主機不存在,則會拋出一個SocketException,這由我的測試證實。
這是
var ips = System.Net.Dns.GetHostEntry("microsoft.com").AddressList;
foreach (var ip in ips)
Console.WriteLine(ip);
// output
64.4.11.37
65.55.58.201
返回的地址的列表,這些都是A記錄從network-tools.com,DNS查詢拉。
Answer records
microsoft.com A 64.4.11.37
microsoft.com A 65.55.58.201
所以我會說它確實拉A記錄。
Dns.GetHostEntry
構建在Windows API之上,不直接使用DNS協議。如果啓用了IPv6,它將會調用getaddrinfo
。否則,它會呼叫gethostbyaddr
。這些功能可能使用本地%SystemRoot%\System32\drivers\etc\hosts
文件,DNS甚至NETBIOS將主機名解析爲IP地址。使用DNS將主機名解析爲IP地址將使用CNAME記錄來查找A記錄。
您可以通過解析www.google.com
來測試此功能,該功能至少現在具有指向www.l.google.com
的CNAME記錄。使用Dns.GetHostEntry
將從A記錄返回www.l.google.com
的IP地址。
對,所以你說它同時使用CNAME和A記錄,因爲它遵循CNAME記錄來查找A記錄。沒有找到任何A記錄會拋出SocketException? –
我不確定CNAME部分。畢竟只有子域名使用CNAME映射到完全限定域名(ftp.domain.com CNAME domain.com)。然而,domain.com本身必須有一個A記錄,那麼如何與Dns.GetHostEntry(「domain.com」)一起使用呢?我只用兩個子域測試了GetHostEntry(),每個域都有一個指向不同服務器的A記錄,GetHostEntry返回了這些Ip,如果我更改了那些A記錄,我相信它會改變GetHostEntry()的結果。 Google.com是全球最繁忙的網站,所以我不認爲這是一個良好的一致性基準。 – Despertar
@GregT:做一個小測試可能是回答你的問題的最好方法。我不確定如果有一個CNAME記錄不指向A記錄,getaddrinfo'如何表現。但是,'Dns.GetHostEntry'的源代碼是公開可用的,而且我可以看到一個套接字錯誤將被封裝在一個'SocketException'中。 –
謝謝你的更好的答案。 –
這是我用於DNS查詢的開源C#庫,http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component,我從這個問題中找到http:// stackoverflow.com/questions/1061248/getting-ns-record-type-using-c-sharp-dns/1061268#comment12106649_1061268 – Despertar
完美!一切都完美! –