gpt4 book ai didi

c# - .NET2 DNS 拒绝超过 126 个字符的主机名,如 "too long"

转载 作者:可可西里 更新时间:2023-11-01 08:24:10 26 4
gpt4 key购买 nike

在编写程序时,我最近发现 .net 中的主机名(或至少在 ping 类中)不应超过 126 个字符。如果主机名较长,则 ping 类会抛出异常。

但是维基百科指出最多允许使用 255 个字符。看起来确实有主机名超过 126 个字符的机器,所以问题是:这个限制可以改变吗?谁是对的?如果不能,如何解析名称?

最佳答案

.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

关于c# - .NET2 DNS 拒绝超过 126 个字符的主机名,如 "too long",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com