En Internet hay varios lugares que le muestran cómo obtener una dirección IP. Y muchos de ellos se parecen a este ejemplo:
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();
Con este ejemplo, obtengo varias direcciones IP, pero solo estoy interesado en obtener la que el enrutador asigna a la computadora que ejecuta el programa: la IP que le daría a alguien si desea acceder a una carpeta compartida en mi computadora para ejemplo.
Si no estoy conectado a una red y estoy conectado a Internet directamente a través de un módem sin enrutador, me gustaría recibir un error. ¿Cómo puedo ver si mi computadora está conectada a una red con C # y si es para obtener la dirección IP de LAN?
c#
networking
Tono Nam
fuente
fuente
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?Respuestas:
Para obtener la dirección IP local:
Para verificar si estás conectado o no:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
fuente
Hay una forma más precisa cuando hay direcciones IP múltiples disponibles en la máquina local.
Connect
un socket UDP y lee su punto final local:Connect
en un socket UDP tiene el siguiente efecto: establece el destino paraSend
/Recv
, descarta todos los paquetes de otras direcciones y, que es lo que usamos, transfiere el socket al estado "conectado", configura sus campos apropiados. Esto incluye verificar la existencia de la ruta hacia el destino de acuerdo con la tabla de enrutamiento del sistema y establecer el punto final local en consecuencia. La última parte parece no estar documentada oficialmente, pero parece un rasgo integral de la API de sockets de Berkeley (un efecto secundario del estado UDP "conectado") que funciona de manera confiable tanto en Windows como en Linux en todas las versiones y distribuciones.Por lo tanto, este método proporcionará la dirección local que se usaría para conectarse al host remoto especificado. No hay una conexión real establecida, por lo tanto, la IP remota especificada puede ser inalcanzable.
fuente
Refactorizando el código de Mrcheif para aprovechar Linq (es decir .Net 3.0+). .
:)
fuente
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:
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.
Ahora para obtener la dirección IPv4 de su interfaz de red Ethernet, llame:
O tu interfaz inalámbrica:
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: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.fuente
item.OperationalStatus
siempre regresaUnknown
.Aquí hay una versión modificada (de la de compman2408) que funcionó para mí:
Puede llamar a este método, por ejemplo, como:
El cambio: estoy recuperando la IP de un adaptador que tiene asignada una IP de puerta de enlace. Segundo cambio: agregué docstrings y break para hacer que este método sea más eficiente.
fuente
break
en lo más internoif
o areturn
haría el truco.Este es el mejor código que encontré para obtener la IP actual, evitando obtener el host VMWare u otra dirección IP no válida.
fuente
Creo que usar LinQ es más fácil:
fuente
Para reír, pensé que trataría de obtener una sola instrucción LINQ utilizando el nuevo operador condicional nulo C # 6. Parece bastante loco y probablemente terriblemente ineficiente, pero funciona.
Lógica cortesía de
Gerardo H
(y por referenciacompman2408
).fuente
Otra forma de obtener IP usando la expresión linq:
fuente
@mrcheif Encontré esta respuesta hoy y fue muy útil, aunque devolvió una IP incorrecta (no debido a que el código no funcionara), pero dio una IP entre redes incorrecta cuando tienes cosas como Himachi ejecutándose.
fuente
192.0.0.0/8
no es una prueba correcta para una dirección IP privada (hay 3 rangos, todos diferentes de este), sino que puede ser un rango de red corporativa, por lo que no es tanto "local".Probado con una o varias tarjetas LAN y máquinas virtuales
fuente
Solo una versión actualizada mía usando LINQ:
fuente
Requisitos previos: debe agregar la referencia System.Data.Linq y referirla
fuente
También estaba luchando para obtener la IP correcta.
Probé una variedad de soluciones aquí, pero ninguna me proporcionó el efecto deseado. Casi todas las pruebas condicionales que se proporcionaron no provocaron el uso de ninguna dirección.
Esto es lo que funcionó para mí, espero que ayude ...
fuente
fuente
Tenga en cuenta que, en el caso general, podría tener varias traducciones NAT y varios servidores dns, cada uno operando en diferentes niveles de traducción NAT.
¿Qué sucede si tiene NAT de nivel de operador y desea comunicarse con otros clientes del mismo operador? En el caso general, nunca se sabe con certeza porque puede aparecer con diferentes nombres de host en cada traducción NAT.
fuente
Obsoleto desaparecido, esto me funciona
fuente
Actualizando la respuesta de Mrchief con Linq, tendremos:
fuente
Esto devuelve direcciones de cualquier interfaz que tenga direcciones de puerta de enlace y direcciones de unidifusión en dos listas separadas, IPV4 e IPV6.
fuente
Ya hay muchas respuestas, pero sigo aportando la mía:
Un trazador de líneas:
nota: Busque desde el final porque aún funciona después de que algunas interfaces se hayan agregado al dispositivo, como MobileHotspot, VPN u otros adaptadores virtuales sofisticados.
fuente
Además, solo un código simple para obtener Client Ip:
Espero que sea de ayuda.
fuente
fuente
Se modificó el código de compman2408 para poder iterar a través de cada uno
NetworkInterfaceType
.Y puedes llamarlo así:
fuente
Debajo de la misma acción
Función LocalIP ()
Dim Host As String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Host
Volver verdadero
Función final
fuente
una línea de código: D
fuente
Si tiene máquinas virtuales o tarjetas de red adicionales, puede haber otros valores en la lista de direcciones. Mi sugerencia es verificar las entradas de la lista de direcciones e imprimir lo que sea apropiado. En mi caso, la entrada 3 era la dirección ipv4 de mi máquina
No olvides agregar
using System.Net;
fuente