nombre - obtener ip del servidor c#
Obtener direcciones IPv4 de Dns.GetHostEntry() (7)
¿Has visto todas las direcciones en la declaración, descartas las de la familia InterNetworkV6 y solo retienes las de IPv4?
Aquí tengo un código que funciona muy bien en máquinas IPv4, pero en nuestro servidor de compilación (un IPv6) falla. En una palabra:
IPHostEntry ipHostEntry = Dns.GetHostEntry(string.Empty);
La documentación de GetHostEntry dice que al pasar en string.Empty obtendrá la dirección IPv4 del localhost. Esto es lo que quiero. El problema es que devuelve la cadena ":: 1:" en nuestra máquina IPv6, que creo que es la dirección IPv6.
Hacer ping a la máquina desde cualquier otra máquina IPv4 da una buena dirección IPv4 ... y hacer un "nombre de máquina ping -4" de sí mismo da la dirección IPv4 correcta ... pero al hacer ping regularmente desde sí mismo se obtiene ":: 1:".
¿Cómo puedo obtener el IPv4 para esta máquina, desde sí mismo?
Para encontrar toda la lista de direcciones válida, este es el código que he 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();
}
Para encontrar todas las direcciones IPv4 locales:
IPAddress[] ipv4Addresses = Array.FindAll(
Dns.GetHostEntry(string.Empty).AddressList,
a => a.AddressFamily == AddressFamily.InterNetwork);
o usa Array.Find
o Array.FindLast
si solo quieres uno.
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 ()
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();
}
}
}
Declara myIP y myHost en una variable pública y úsala en cualquier función del formulario.
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;
}
IPHostEntry ipHostInfo = Dns.GetHostEntry(serverName);
IPAddress ipAddress = ipHostInfo.AddressList
.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);