2012-06-06 13 views
6

Tôi không thể tìm thấy bất kỳ mô tả thích hợp nào trong tài liệu về những gì thực tế này thực hiện.Dns.GetHostEntry Method (String) thực sự làm gì?

Kiểm tra sự tồn tại của bản ghi A hoặc bản ghi CNAME hoặc cả hai?

Sự hiểu biết của tôi là trong .NET 4, điều này sẽ ném ra một SocketException nếu máy chủ không tồn tại và điều này được xác nhận bằng thử nghiệm của tôi.

Trả lời

7

Đây là danh sách các địa chỉ trả về bởi

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 

Và đây là những bản ghi A kéo từ network-tools.com, truy vấn DNS.

Answer records 
microsoft.com  A 64.4.11.37 
microsoft.com  A 65.55.58.201 

Vì vậy, tôi muốn nói nó kéo bản ghi A.

+0

Cảm ơn bạn đã có câu trả lời tốt hơn nhiều. –

+0

Đây là thư viện C# mã nguồn mở tôi sử dụng cho các truy vấn DNS, http://www.codeproject.com/Articles/12072/C-NET-DNS-query-component mà tôi tìm thấy từ câu hỏi này, http: // stackoverflow.com/questions/1061248/getting-ns-record-type-using-c-sharp-dns/1061268#comment12106649_1061268 – Despertar

+0

hoàn hảo! hoàn hảo trong tất cả! –

4

Dns.GetHostEntry được xây dựng trên đầu Windows API và không sử dụng giao thức DNS trực tiếp. Nếu IPv6 được kích hoạt, nó sẽ gọi getaddrinfo. Nếu không, nó sẽ gọi gethostbyaddr. Các hàm này có thể sử dụng tệp %SystemRoot%\System32\drivers\etc\hosts cục bộ, DNS hoặc thậm chí NETBIOS để phân giải tên máy chủ thành địa chỉ IP. Việc phân giải tên máy chủ thành địa chỉ IP bằng DNS sẽ sử dụng bản ghi CNAME để tìm bản ghi A.

Bạn có thể kiểm tra điều này bằng cách giải quyết www.google.com mà ít nhất hiện tại có bản ghi CNAME trỏ tới www.l.google.com. Sử dụng Dns.GetHostEntry sẽ trả lại địa chỉ IP từ bản ghi A cho www.l.google.com.

+0

Phải, vì vậy bạn đang nói nó sử dụng cả bản ghi CNAME và A ở chỗ nó theo dõi bản ghi CNAME để tìm bản ghi A. Và thất bại để tìm thấy bất kỳ bản ghi A sẽ ném SocketException? –

+0

Tôi không chắc chắn về phần CNAME. Sau khi tất cả các tên miền phụ chỉ sử dụng CNAME để ánh xạ tới các miền đủ điều kiện (ftp.domain.com CNAME domain.com). Tuy nhiên domain.com chính nó phải có một bản ghi A để làm thế nào mà sẽ làm việc với Dns.GetHostEntry ("domain.com")? Tôi chỉ thử nghiệm GetHostEntry() với hai tên miền phụ của tôi, mỗi bản ghi A trỏ đến một máy chủ khác và GetHostEntry trả về các IP đó và nếu tôi thay đổi các bản ghi A, tôi chắc chắn nó sẽ thay đổi kết quả của GetHostEntry(). Google.com là trang web bận rộn nhất trên thế giới vì vậy tôi không nghĩ rằng điều đó tạo nên một tiêu chuẩn tốt cho lợi ích nhất quán. – Despertar

+0

@GregT: Làm một bài kiểm tra nhỏ có lẽ là cách tốt nhất để trả lời câu hỏi của bạn. Tôi không chắc làm thế nào 'getaddrinfo' hoạt động nếu có một bản ghi CNAME không trỏ đến một bản ghi A. Tuy nhiên, mã nguồn cho 'Dns.GetHostEntry' được cung cấp công khai và cho đến nay tôi có thể thấy một lỗi socket sẽ được bao bọc trong một' SocketException'. –