2011-10-30 10 views
12

Mentre si lavora su un programma, di recente ho trovato che i nomi host in .net (o almeno nella classe ping) non dovrebbero avere più di 126 caratteri. La classe ping genera un'eccezione se un nome host è più lungo..NET2 DNS rifiuta nomi host di 126 caratteri come "troppo lunghi"

Tuttavia Wikipedia afferma che sono consentiti fino a 255 caratteri. E sembra che ci siano macchine con un nome host più lungo di 126 caratteri, quindi la domanda è: può essere modificato questo limite, chi ha ragione e come risolvere i nomi se non può?

+12

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." –

+4

Wikpedia non è il repository definitivo delle specifiche. –

+0

@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

risposta

1

Entrambe le informazioni sono corrette.

Il limite di 255 caratteri si riferisce al numero di telefono completo (ad esempio some.thing.example.com).

A sua volta, ciascuna etichetta (ad esempio example o com) è limitata a 63 caratteri. Quindi i domini di primo livello hanno un limite teorico di 126 caratteri non punti.

2

chiamata gethostbyname, quindi passare un indirizzo IP (che non è mai più di un paio di dozzine personaggi, anche per IPv6) per la classe ping.

9

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 
+0

Ottima risposta, grazie per la condivisione. Nota che questo esempio cerca solo i record DNS_TYPE_A e non DNS_TYPE_AAAA (0x1c), quindi restituirà solo indirizzi IPv4 e nessun indirizzo IPv6. – EricLaw

Problemi correlati