Получить IPv4-адреса из Dns.GetHostEntry()
У меня есть код, который отлично работает на машинах IPv4, но на нашем сервере сборки (IPv6) он терпит неудачу. В двух словах:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
в документации для GetHostEntry говорится, что передача строки.Пустой получит вам IPv4-адрес localhost. Это то, чего я хочу. Проблема в том, что он возвращает строку "::1:" на нашей машине IPv6, которая, я считаю, является адресом IPv6.
Pinging машина с любой другой машины IPv4 дает хороший IPv4 адрес... и делает "ping -4 machinename" от себя дает правильный IPv4 адрес.... но пощипывание его регулярно от себя дает ":: 1:".
Как я могу получить IPv4 для этой машины, от себя?
7 ответов
вы смотрели все адреса в возвращении, отбросьте те из семья InterNetworkV6 и сохранить только IPv4?
найти все локальные IPv4-адреса:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
или использовать Array.Find
или Array.FindLast
Если вы просто хотите один.
public Form1()
{
InitializeComponent();
string myHost = System.Net.Dns.GetHostName();
string myIP = null;
for (int i = 0; i <= System.Net.Dns.GetHostEntry(myHost).AddressList.Length - 1; i++)
{
if (System.Net.Dns.GetHostEntry(myHost).AddressList[i].IsIPv6LinkLocal == false)
{
myIP = System.Net.Dns.GetHostEntry(myHost).AddressList[i].ToString();
}
}
}
объявить myIP и myHost в общедоступной переменной и использовать в любой функции формы.
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
public static string GetIPAddress(string hostname)
{
IPHostEntry host;
host = Dns.GetHostEntry(hostname);
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
//System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
return ip.ToString();
}
}
return string.Empty;
}
чтобы найти весь допустимый список адресов, это код, который я использовал
public static IEnumerable<string> GetAddresses()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList();
}
протокол IPv6
lblIP.Текст = Система.Чистая.ДНС.GetHostEntry(Системы.Чистая.ДНС.Функцией gethostname).AddressList(0).Метод toString()
протокол IPv4
lblIP.Текст = Система.Чистая.ДНС.GetHostEntry(Системы.Чистая.ДНС.Функцией gethostname).AddressList(1).Метод toString()