Получить IPv4-адреса из Dns.GetHostEntry()
Вопрос
У меня здесь есть некоторый код, который отлично работает на компьютерах с IPv4, но на нашем сервере сборки (IPv6) он выходит из строя.В двух словах:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
В документации для GetHostEntry говорится, что при передаче в string.Empty вы получите IPv4-адрес локального хостинга.Это то, чего я хочу.Проблема в том, что он возвращает строку "::1:" на нашем компьютере с IPv6, которая, как я полагаю, является IPv6-адресом.
Пинг компьютера с любого другого компьютера IPv4 дает хороший IPv4-адрес...и делая "имя машины ping -4" от себя выдает правильный IPv4-адрес....но пинг его регулярно от себя выдает "::1:".
Как я могу получить IPv4 для этого компьютера от самого себя?
Решение
Вы смотрели на все адреса в обратном случае выбросьте те из семейная сетевая работаv6 и сохранить только IPv4-адреса?
Другие советы
Чтобы найти все локальные IPv4-адреса:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
или использовать Array.Find
или Array.FindLast
если ты просто хочешь одного.
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
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 в общедоступных переменных и используйте в любой функции формы.
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.Текст = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).Список адресов(0).toString()
IPv4
lblIP.Текст = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).Список адресов(1).toString()