¿Cómo obtener la dirección IP del servidor en el que se ejecuta mi aplicación C#?

Resuelto Nefzen asked hace 15 años • 0 respuestas

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?

Nefzen avatar Jul 01 '09 20:07 Nefzen
Aceptado

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 ToStringuna enumeración para comparar.

Andrew Hare avatar Jul 01 '2009 13:07 Andrew Hare

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;
}
ezgar avatar Feb 28 '2010 23:02 ezgar

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);
Mohammed A. Fadil avatar Oct 05 '2011 12:10 Mohammed A. Fadil

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 comprobandoDuplicateAddressDetectionState == 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);
}
Dr. Wily's Apprentice avatar Jan 26 '2012 15:01 Dr. Wily's Apprentice