首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET2域名系统以“太长”为由拒绝超过126个字符的主机名

.NET2域名系统以“太长”为由拒绝超过126个字符的主机名
EN

Stack Overflow用户
提问于 2011-10-31 05:56:56
回答 4查看 498关注 0票数 12

在开发一个程序时,我最近发现.net (或者至少是ping类)中的主机名不应该超过126个字符。如果主机名更长,ping类将抛出异常。

然而,维基百科规定,最多允许255个字符。而且看起来确实存在主机名长度超过126个字符的计算机,所以问题是:这个限制是否可以更改,谁是正确的,如果不能,如何解析名称?

EN

回答 4

Stack Overflow用户

发布于 2011-10-31 07:55:43

.NET Dns类的主机名有126个字符的硬性上限(针对.NET4进行了检查)。

但是,您可以使用较低级别的Win32 DnsQuery方法(使用P/Invoke )将主机名转换为IP地址,然后将这些原始地址与.NET网络类一起使用。

下面是一个使用这种方法的示例DnsAddr类:

代码语言:javascript
复制
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;
    }
}

下面是一个示例测试程序:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        var addresses = DnsAddr.GetAddress("google.com");
        foreach (var address in addresses)
            Console.WriteLine(address.ToString());
    }
}

在我的机器上,它会产生这个输出:

代码语言:javascript
复制
173.194.33.51
173.194.33.50
173.194.33.49
173.194.33.52
173.194.33.48
票数 9
EN

Stack Overflow用户

发布于 2011-10-31 07:14:06

调用gethostbyname,然后向ping类传递一个IP地址(它永远不会超过几十个字符,即使对于IPv6也是如此)。

票数 2
EN

Stack Overflow用户

发布于 2011-10-31 06:02:49

这两个信息都是正确的。

255个字符的限制是指整个主机名(例如some.thing.example.com)。

反过来,每个标签(例如examplecom)限制为63个字符。因此,顶级域在理论上有126非点字符的限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7948162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档