La classe .NET Dns
ha un limite superiore rigido di 126 caratteri per i nomi host (controllato per .NET4).
Tuttavia, è possibile utilizzare il metodo Win32 DnsQuery
di livello inferiore utilizzando P/Invoke per tradurre i nomi host in indirizzi IP e quindi utilizzare tali indirizzi non elaborati con le classi di rete .NET.
Ecco un esempio DnsAddr
classe utilizzando questo approccio:
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;
}
}
Ecco un programma di test di esempio:
class Program
{
static void Main(string[] args)
{
var addresses = DnsAddr.GetAddress("google.com");
foreach (var address in addresses)
Console.WriteLine(address.ToString());
}
}
che sulla mia macchina produce questo risultato:
173.194.33.51
173.194.33.50
173.194.33.49
173.194.33.52
173.194.33.48
fonte
2011-10-30 23:55:42
Devo amare "specifiche". Da [RFC 1123] (http://www.ietf.org/rfc/rfc1123.txt), "Il software host DEVE gestire i nomi host fino a 63 caratteri e DOVREBBE gestire i nomi host fino a 255 caratteri." –
Wikpedia non è il repository definitivo delle specifiche. –
@John True. Tuttavia ci sono macchine che lo usano (il mio esempio è di google) e funziona nella riga di comando e anche nei miei 3 browser installati. Quindi dovrebbe funzionare anche in .net – FinalNotriX