Sé que esto puede estar pateando un caballo muerto, pero tal vez esto pueda ayudar a alguien. He buscado por todas partes una forma de encontrar mi dirección IP local, pero en todas partes me dice que use:
Dns.GetHostEntry(Dns.GetHostName());
No me gusta para nada porque solo obtiene todas las direcciones asignadas a su computadora. Si tiene varias interfaces de red (que prácticamente todas las computadoras tienen hoy en día) no tiene idea de qué dirección va con qué interfaz de red. Después de hacer un montón de investigación, creé una función para usar la clase NetworkInterface y extraer la información de ella. De esta manera puedo decir qué tipo de interfaz es (Ethernet, inalámbrica, loopback, túnel, etc.), si está activa o no, y SOOO mucho más.
public string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}
Ahora para obtener la dirección IPv4 de su interfaz de red Ethernet, llame:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
O tu interfaz inalámbrica:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Si intenta obtener una dirección IPv4 para una interfaz inalámbrica, pero su computadora no tiene una tarjeta inalámbrica instalada, solo devolverá una cadena vacía. Lo mismo con la interfaz Ethernet.
¡Espero que esto ayude a alguien! :-)
EDITAR:
Se señaló (gracias @NasBanov) que, aunque esta función consiste en extraer la dirección IP de una manera mucho mejor que usarla, Dns.GetHostEntry(Dns.GetHostName())
no funciona muy bien al admitir múltiples interfaces del mismo tipo o múltiples direcciones IP en una sola interfaz . Solo devolverá una única dirección IP cuando pueda haber varias direcciones asignadas. Para devolver TODAS estas direcciones asignadas, simplemente puede manipular la función original para que siempre devuelva una matriz en lugar de una sola cadena. Por ejemplo:
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
Ahora esta función devolverá TODAS las direcciones asignadas para un tipo de interfaz específico. Ahora, para obtener solo una cadena, puede usar la .FirstOrDefault()
extensión para devolver el primer elemento de la matriz o, si está vacío, devolver una cadena vacía.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
Esta afirmación parece contradictoria. ¿Estás tratando de averiguar si tu computadora está conectada a una LAN privada o a Internet?