Estoy ejecutando un servidor y quiero mostrar mi propia dirección IP.
¿Cuál es la sintaxis para obtener la propia dirección IP (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. ¿Hay una mejor manera de hacerlo?
c#
ip-address
Nefzen
fuente
fuente
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Respuestas:
No, esa es la mejor manera de hacerlo. Como una máquina podría tener varias direcciones IP, debe iterar la colección de ellas para encontrar la correcta.
Editar: La única cosa que me gustaría cambiar sería cambiar esto:
a esto:
No hay necesidad de
ToString
una enumeración para comparar.fuente
break
declaración después de que se descubriera que la IP evita iterar innecesariamente más a través de la colección (en este caso dudo que el impacto en el rendimiento sea importante, pero me gusta enfatizar los buenos hábitos de codificación en general)La única forma de conocer su IP pública es pedirle a otra persona que le diga; este código puede ayudarte:
fuente
Más limpio y una solución todo en uno: D
fuente
Si no puede confiar en obtener su dirección IP de un servidor DNS (que me ha sucedido), puede utilizar el siguiente enfoque:
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" en su máquina, y generalmente hay bastantes, incluso si solo tiene un adaptador inalámbrico y / o un hardware de adaptador de Ethernet instalado en su máquina. Todas estas interfaces de red tienen direcciones IP válidas para su máquina local, aunque probablemente solo desee una.
Si está buscando una dirección IP, deberá filtrar la lista hacia abajo hasta que pueda identificar la dirección correcta. Probablemente necesite experimentar un poco, pero tuve éxito con el siguiente enfoque:
OperationalStatus == OperationalStatus.Up
. Esto excluirá su adaptador físico de Ethernet, por ejemplo, si no tiene un cable de red enchufado.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 .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.En este punto, tomo la dirección de la primera dirección (si la hay) de unidifusión 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 muestra 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.
fuente
fuente
Acabo de probar esto en mi máquina y funciona.
fuente
Si desea evitar el uso de DNS:
fuente
No confíe en InterNetwork todo el tiempo porque puede tener más de un dispositivo que también usa IP4 que arruinaría los resultados para obtener su IP. Ahora, si lo desea, puede copiar esto y revisarlo o actualizarlo como mejor le parezca.
Primero obtengo la dirección del enrutador (puerta de enlace) Si vuelve a estar conectado a una puerta de enlace (lo que significa que no está conectado directamente al módem inalámbrico o no), entonces tenemos nuestra dirección de puerta de enlace como dirección IP, de lo contrario, tenemos una referencia de dirección IP de puntero nulo .
Luego necesitamos obtener la lista de direcciones IP de la computadora. Aquí es donde las cosas no son tan difíciles porque los enrutadores (todos los enrutadores) usan 4 bytes (...). Los primeros tres son los más importantes porque cualquier computadora conectada tendrá una dirección IP4 que coincida con los primeros tres bytes. Ej: 192.168.0.1 es estándar para la dirección IP predeterminada del enrutador, a menos que el administrador lo cambie. '192.168.0' o lo que sea que sean, es lo que necesitamos hacer coincidir. Y eso es todo lo que hice en la función IsAddressOfGateway. La razón de la coincidencia de longitud es porque no todas las direcciones (que son solo para la computadora) tienen una longitud de 4 bytes. Si escribe netstat en el cmd, encontrará que esto es cierto. Entonces ahí lo tienes. Sí, se necesita un poco más de trabajo para obtener realmente lo que está buscando. Proceso de eliminación. Y por el amor de Dios, no encuentre la dirección haciendo ping, lo que lleva tiempo porque primero está enviando la dirección para hacer ping y luego tiene que devolver el resultado. No, trabaje directamente con las clases .Net que se ocupan del entorno de su sistema y obtendrá las respuestas que busca cuando solo tiene que ver con su computadora.
Ahora, si está conectado directamente a su módem, el proceso es casi el mismo porque el módem es su puerta de enlace, pero la submáscara no es la misma porque obtiene la información directamente de su servidor DNS a través del módem y no está enmascarado por el enrutador que sirve Internet para usted, aunque todavía puede usar el mismo código porque el último byte de la IP asignada al módem es 1. Entonces, si la IP enviada desde el módem que cambia es 111.111.111.1 ', obtendrá 111.111.111. valor de byte). Tenga en cuenta que necesitamos encontrar la información de la puerta de enlace porque hay más dispositivos que se ocupan de la conectividad a Internet que su enrutador y módem.
Ahora puede ver por qué NO cambia los primeros dos bytes 192 y 168 de su enrutador. Estos se distinguen estrictamente solo por enrutadores y no por el uso de Internet; de lo contrario, tendríamos un problema grave con el protocolo IP y el doble ping que provocaría el bloqueo de su computadora. Imagen de que su IP de enrutador asignada es 192.168.44.103 y también hace clic en un sitio con esa IP. ¡DIOS MIO! Su computadora no sabría qué hacer ping. Choque justo ahí. Para evitar este problema, solo se asignan estos enrutadores y no para el uso de Internet. Por lo tanto, deje los dos primeros bytes del enrutador solo.
fuente
255.255.255.0
, y lo hará de una manera bastante complicada IMO.Solo pensé que agregaría mi propia línea (aunque ya hay muchas otras respuestas útiles).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
fuente
Para obtener la dirección IP pública actual, todo lo que necesita hacer es crear una página ASPX con la siguiente línea en el evento de carga de la página:
fuente
Si está ejecutando en la intranet, podrá obtener la dirección IP de la máquina local y, de lo contrario, obtendrá una dirección IP externa con esto: Web:
Escritorio:
fuente
Mira aquí para más detalles.
Debes recordar que tu computadora puede tener más de una IP (en realidad siempre la tiene), entonces, ¿cuál buscas?
fuente
Prueba esto:
fuente
Tal vez por IP externa puede considerar (si está en un contexto de servidor web) usar esto
Estaba haciendo la misma pregunta que usted y la encontré en este artículo de stackoverflow.
Funcionó para mi.
fuente
fuente
fuente
Línea simple de código simple que devuelve la primera dirección IPV4 interna o nula si no hay ninguna. Agregado como un comentario anterior, pero puede ser útil para alguien (algunas soluciones anteriores devolverán varias direcciones que necesitan un mayor filtrado).
También es fácil devolver loopback en lugar de nulo, supongo que con:
fuente
IPAddress.Loopback
? :)Para encontrar la lista de direcciones IP, he usado esta solución
Pero personalmente me gusta la solución a continuación para obtener una dirección IP válida local
fuente
La solución LINQ:
fuente
Así es como lo resolví. Sé que si tiene varias interfaces físicas, esto podría no seleccionar la ética exacta que desea.
fuente
La pregunta no dice ASP.NET MVC, pero de todos modos dejo esto aquí:
fuente
Obtenga todas las direcciones IP como cadenas usando LINQ:
PARA FILTRAR A LOS PRIVADOS ...
Primero, defina un método de extensión
IsPrivate()
:... Y luego úselo para filtrar IP privadas:
fuente
Funciona para mí ... y debería ser más rápido en la mayoría de los casos (si no todos) que consultar un servidor DNS. Gracias al aprendiz del Dr. Wily ( aquí ).
Solo como referencia, este es el código de clase completo donde lo definí:
fuente
Otra forma de obtener su dirección IP pública es usar el
resolve1.opendns.com
servidor OpenDNS conmyip.opendns.com
como solicitud.En la línea de comando esto es:
O en C # usando el DNSClient nuget:
Esto es un poco más limpio que alcanzar los puntos finales http y analizar las respuestas.
fuente
Y esto es para obtener todas las IP locales en formato csv en VB.NET
fuente
Para obtener la dirección IP remota de la manera más rápida posible. Debe tener que usar un descargador o crear un servidor en su computadora.
La desventaja de usar este código simple: (lo cual se recomienda) es que tomará de 3 a 5 segundos obtener su dirección IP remota porque el cliente web cuando se inicializa siempre toma de 3 a 5 segundos para verificar la configuración de su proxy.
Así es como lo solucioné ... (la primera vez todavía toma 3-5 segundos) pero después de eso siempre obtendrá su dirección IP remota en 0-2 segundos dependiendo de su conexión.
fuente