Подтвердить что ты не робот

.NET2 DNS отклоняет имена хостов более 126 символов как "слишком длинные",

Во время работы над программой я недавно обнаружил, что имена хостов в .net(или, по крайней мере, в классе ping) не должны содержать более 126 символов. Класс ping генерирует исключение, если имя хоста длиннее.

Однако Wikipedia заявляет, что допускается до 255 символов. И похоже, что на самом деле есть машины с именем хоста длиной более 126 символов, поэтому вопрос: может ли этот предел быть изменен, кто прав и как разрешать имена, если он не может?

4b9b3361

Ответ 1

Класс .NET Dns имеет жесткий верхний предел в 126 символов для имен хостов (проверен на .NET4).

Однако вы можете использовать метод Win32 DnsQuery нижнего уровня с помощью P/Invoke для перевода имен хостов в IP-адреса, а затем использовать эти необработанные адреса с помощью Сетевые классы .NET.

Вот пример DnsAddr, используя этот подход:

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;
    }
}

Вот пример тестовой программы:

class Program
{
    static void Main(string[] args)
    {
        var addresses = DnsAddr.GetAddress("google.com");
        foreach (var address in addresses)
            Console.WriteLine(address.ToString());
    }
}

который на моей машине производит этот вывод:

173.194.33.51
173.194.33.50
173.194.33.49
173.194.33.52
173.194.33.48

Ответ 2

Вызвать gethostbyname, а затем передать IP-адрес (который не более пары десятков символов, даже для IPv6), на пинг класс.

Ответ 3

Обе информации правильные.

Предел 255 символов относится к имени хоста целиком (например, some.thing.example.com).

В свою очередь, каждая метка (например, example или com) ограничена 63 символами. Таким образом, домены верхнего уровня имеют теоретический предел 126 неточечных символов.

Ответ 4

По-видимому, это похоже на объяснение Джоэля и Денниса..Net не способен разрешать имена длиной более 126 символов.

Однако, если кто-то имеет такую ​​же проблему, посмотрите здесь в DNS Plus: http://www.simpledns.com/dns-client-lib.aspx#download