Lớp .NET Dns
có giới hạn trên cứng là 126 ký tự cho tên máy chủ (được chọn cho .NET4).
Tuy nhiên, bạn có thể sử dụng phương thức Win32 DnsQuery
cấp thấp hơn bằng cách sử dụng P/Gọi để dịch tên máy chủ thành địa chỉ IP và sau đó sử dụng địa chỉ thô đó với lớp mạng .NET.
Đây là một mẫu DnsAddr
lớp sử dụng phương pháp này:
public static class DnsAddr
{
[DllImport("dnsapi", EntryPoint = "DnsQuery_W", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
private static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)]ref string pszName, QueryTypes wType, QueryOptions options, int aipServers, ref IntPtr ppQueryResults, int pReserved);
[DllImport("dnsapi", CharSet = CharSet.Auto, SetLastError = true)]
private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);
public static IEnumerable<IPAddress> GetAddress(string domain)
{
IntPtr ptr1 = IntPtr.Zero;
IntPtr ptr2 = IntPtr.Zero;
List<IPAddress> list = new List<IPAddress>();
DnsRecord record = new DnsRecord();
int num1 = DnsAddr.DnsQuery(ref domain, QueryTypes.DNS_TYPE_A, QueryOptions.DNS_QUERY_NONE, 0, ref ptr1, 0);
if (num1 != 0)
throw new Win32Exception(num1);
for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = record.pNext)
{
record = (DnsRecord)Marshal.PtrToStructure(ptr2, typeof(DnsRecord));
list.Add(new IPAddress(record.ipAddress));
}
DnsAddr.DnsRecordListFree(ptr1, 0);
return list;
}
private enum QueryOptions
{
DNS_QUERY_NONE = 0,
}
private enum QueryTypes
{
DNS_TYPE_A = 1,
}
[StructLayout(LayoutKind.Sequential)]
private struct DnsRecord
{
public IntPtr pNext;
public string pName;
public short wType;
public short wDataLength;
public int flags;
public int dwTtl;
public int dwReserved;
public uint ipAddress;
}
}
Đây là một chương trình thử nghiệm mẫu:
class Program
{
static void Main(string[] args)
{
var addresses = DnsAddr.GetAddress("google.com");
foreach (var address in addresses)
Console.WriteLine(address.ToString());
}
}
đó trên máy tính của tôi sản xuất sản lượng này:
173.194.33.51
173.194.33.50
173.194.33.49
173.194.33.52
173.194.33.48
Nguồn
2011-10-30 23:55:42
Gotta yêu "thông số kỹ thuật". Từ [RFC 1123] (http://www.ietf.org/rfc/rfc1123.txt), "Phần mềm lưu trữ PHẢI xử lý tên máy chủ tối đa 63 ký tự và NÊN xử lý tên máy chủ tối đa 255 ký tự". –
Wikpedia không phải là kho lưu trữ thông số kỹ thuật chính xác. –
@John True. Tuy nhiên có những máy sử dụng nó (ví dụ của tôi là từ google) và nó hoạt động trong dòng lệnh và cũng có trong 3 trình duyệt được cài đặt của tôi. Vì vậy, nó cũng nên làm việc trong .net – FinalNotriX