在开发一个程序时,我最近发现.net (或者至少是ping类)中的主机名不应该超过126个字符。如果主机名更长,ping类将抛出异常。
然而,维基百科规定,最多允许255个字符。而且看起来确实存在主机名长度超过126个字符的计算机,所以问题是:这个限制是否可以更改,谁是正确的,如果不能,如何解析名称?
发布于 2011-10-31 07:55:43
.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发布于 2011-10-31 07:14:06
调用gethostbyname,然后向ping类传递一个IP地址(它永远不会超过几十个字符,即使对于IPv6也是如此)。
发布于 2011-10-31 06:02:49
这两个信息都是正确的。
255个字符的限制是指整个主机名(例如some.thing.example.com)。
反过来,每个标签(例如example或com)限制为63个字符。因此,顶级域在理论上有126非点字符的限制。
https://stackoverflow.com/questions/7948162
复制相似问题