.NET2 DNS отклоняет имена хостов длиной более 126 символов как "слишком длинные"
Работая над программой, я недавно обнаружил, что имена хостов в.net (или, по крайней мере, в классе ping) не должны содержать более 126 символов. Класс ping выдает исключение, если имя хоста длиннее.
Однако Википедия утверждает, что допускается до 255 символов. И похоже, что действительно есть машины с именем хоста длиннее 126 символов, поэтому возникает вопрос: можно ли изменить этот предел, кто прав, и как разрешать имена, если это невозможно?
4 ответа
Сеть 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
Вызов gethostbyname
затем передайте IP-адрес (который никогда не превышает пары десятков символов, даже для IPv6) в класс ping.
Видимо, это как объяснили Джоэл и Деннис. .Net не способен разрешать имена длиннее 126 символов.
Однако, если у кого-то есть такая же проблема, посмотрите здесь на DNS Plus: http://www.simpledns.com/dns-client-lib.aspx
Обе данные верны.
Ограничение в 255 символов относится ко всему имени хоста (например, some.thing.example.com
).
В свою очередь, каждый ярлык (например, example
или же com
) ограничен до 63 символов. Таким образом, домены верхнего уровня имеют теоретический предел 126
не точечные символы.