Obter endereços IPv4 de Dns.GetHostEntry ()
Pergunta
Eu tenho algum código aqui que funciona muito bem em máquinas IPv4, mas em nosso servidor de compilação (uma IPv6) ele falhar. Em poucas palavras:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
A documentação para GetHostEntry diz que passando em string.Empty você irá obter o endereço IPv4 do localhost. É isso que eu quero. O problema é que ele está retornando a string ":: 1:". Na nossa máquina IPv6, que eu acredito é o endereço IPv6
O ping a máquina de qualquer outra máquina IPv4 dá um bom endereço IPv4 ... e fazendo um "ping -4 machinename" de si mesmo dá o endereço IPv4 correta .... mas ping-lo regularmente de si mesmo dá ":: 1:".
Como posso obter o IPv4 para esta máquina, de si mesmo?
Solução
Você já olhou para tudo os endereços no retorno, descarte as de família InterNetworkV6 e reter apenas os IPv4?
Outras dicas
Para encontrar todos os endereços IPv4 locais:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
ou uso Array.Find
ou Array.FindLast
se você quer apenas um.
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();
}
}
}
Declare MyIP e meuHost na variável pública e uso em qualquer função da forma.
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;
}
Para localizar todos lista de endereços válidos este é o código que tenho usado
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.Text System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (0) .ToString ()
IPv4
= lblIP.Text System.Net.Dns.GetHostEntry (System.Net.Dns.GetHostName) .AddressList (1) .ToString ()