.NET2 DNS отклоняет имена хостов длиной более 126 символов как «слишком длинные» - PullRequest
12 голосов
/ 31 октября 2011

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

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

Ответы [ 4 ]

9 голосов
/ 31 октября 2011

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

Однако вы можете использовать более низкий уровень Win32 DnsQuery*Метод 1006 *, использующий 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 голосов
/ 31 октября 2011

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

1 голос
/ 31 октября 2011

Видимо, как объяснили Джоэл и Деннис..Net не способен разрешать имена длиннее 126 символов.

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

1 голос
/ 31 октября 2011

Обе данные верны.

Ограничение в 255 символов относится к полному имени хоста (например, some.thing.example.com).

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

...