¿Cómo obtener la dirección IP del servidor en el que se ejecuta mi aplicación C#?
Estoy ejecutando un servidor y quiero mostrar mi propia dirección IP.
¿Cuál es la sintaxis para obtener la dirección IP propia (si es posible, externa) de la computadora?
Alguien escribió el siguiente código.
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
Sin embargo, generalmente desconfío del autor y no entiendo este código. ¿Existe una mejor manera de hacerlo?
No, esa es prácticamente la mejor manera de hacerlo. Como una máquina puede tener varias direcciones IP, es necesario iterar la colección de ellas para encontrar la adecuada.
Editar: Lo único que cambiaría sería cambiar esto:
if (ip.AddressFamily.ToString() == "InterNetwork")
a esto:
if (ip.AddressFamily == AddressFamily.InterNetwork)
No es necesaria ToString
una enumeración para comparar.
La única forma de saber tu IP pública es pedirle a otra persona que te la diga; este código puede ayudarte:
public string GetPublicIP()
{
String direction = "";
WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
using (WebResponse response = request.GetResponse())
using (StreamReader stream = new StreamReader(response.GetResponseStream()))
{
direction = stream.ReadToEnd();
}
//Search for the ip in the html
int first = direction.IndexOf("Address: ") + 9;
int last = direction.LastIndexOf("</body>");
direction = direction.Substring(first, last - first);
return direction;
}
Limpiador y una solución todo en uno :D
//This returns the first IP4 address or null
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
Si no puede confiar en obtener su dirección IP de un servidor DNS (lo que me pasó a mí), puede utilizar el siguiente método:
El espacio de nombres System.Net.NetworkInformation contiene una clase NetworkInterface , que tiene un método estático GetAllNetworkInterfaces .
Este método devolverá todas las "interfaces de red" de su máquina, y generalmente hay bastantes, incluso si solo tiene un adaptador inalámbrico y/o un hardware de adaptador Ethernet instalado en su máquina. Todas estas interfaces de red tienen direcciones IP válidas para su máquina local, aunque probablemente sólo desee una.
Si está buscando una dirección IP, deberá filtrar la lista hasta que pueda identificar la dirección correcta. Probablemente necesitarás experimentar un poco, pero tuve éxito con el siguiente enfoque:
- Filtre cualquier interfaz de red que esté inactiva comprobando
OperationalStatus == OperationalStatus.Up
. Esto excluirá su adaptador Ethernet físico, por ejemplo, si no tiene un cable de red conectado.
Para cada NetworkInterface, puede obtener un objeto IPInterfaceProperties utilizando el método GetIPProperties y, desde un objeto IPInterfaceProperties, puede acceder a la propiedad UnicastAddresses para obtener una lista de objetos UnicastIPAddressInformation .
- Filtre direcciones de unidifusión no preferidas comprobando
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
- Filtre direcciones "virtuales" comprobando
AddressPreferredLifetime != UInt32.MaxValue
.
En este punto tomo la dirección de la primera dirección de unidifusión (si la hay) que coincida con todos estos filtros.
EDITAR:
[código revisado el 16 de mayo de 2018 para incluir las condiciones mencionadas en el texto anterior para el estado de detección de direcciones duplicadas y la vida útil preferida]
El siguiente ejemplo demuestra el filtrado basado en el estado operativo, la familia de direcciones, excluyendo la dirección de bucle invertido (127.0.0.1), el estado de detección de direcciones duplicadas y la vida útil preferida.
static IEnumerable<IPAddress> GetLocalIpAddresses()
{
// Get the list of network interfaces for the local computer.
var adapters = NetworkInterface.GetAllNetworkInterfaces();
// Return the list of local IPv4 addresses excluding the local
// host, disconnected, and virtual addresses.
return (from adapter in adapters
let properties = adapter.GetIPProperties()
from address in properties.UnicastAddresses
where adapter.OperationalStatus == OperationalStatus.Up &&
address.Address.AddressFamily == AddressFamily.InterNetwork &&
!address.Equals(IPAddress.Loopback) &&
address.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred &&
address.AddressPreferredLifetime != UInt32.MaxValue
select address.Address);
}