¿Cómo obtengo la dirección IP de la red local de una computadora mediante progtwigción? (DO#)

Necesito obtener la dirección IP de la red local actual de la computadora (por ejemplo, 192.168.0.220) de mi progtwig usando C # y .NET 3.5. No puedo usar 127.0.0.1 en este caso.

¿Cuál es la mejor manera de hacer esto?

Enlace. Allí dice, agrega System.net y usa los siguientes

//To get the local IP address string sHostName = Dns.GetHostName (); IPHostEntry ipE = Dns.GetHostByName (sHostName); IPAddress [] IpA = ipE.AddressList; for (int i = 0; i < IpA.Length; i++) { Console.WriteLine ("IP Address {0}: {1} ", i, IpA[i].ToString ()); } 

Si está buscando el tipo de información que la utilidad de línea de comando, ipconfig, puede proporcionar, probablemente debería estar usando el espacio de nombres System.Net.NetworkInformation.

Este código de ejemplo enumerará todas las interfaces de red y volcará las direcciones conocidas para cada adaptador.

 using System; using System.Net; using System.Net.NetworkInformation; class Program { static void Main(string[] args) { foreach ( NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() ) { Console.WriteLine("Network Interface: {0}", netif.Name); IPInterfaceProperties properties = netif.GetIPProperties(); foreach ( IPAddress dns in properties.DnsAddresses ) Console.WriteLine("\tDNS: {0}", dns); foreach ( IPAddressInformation anycast in properties.AnycastAddresses ) Console.WriteLine("\tAnyCast: {0}", anycast.Address); foreach ( IPAddressInformation multicast in properties.MulticastAddresses ) Console.WriteLine("\tMultiCast: {0}", multicast.Address); foreach ( IPAddressInformation unicast in properties.UnicastAddresses ) Console.WriteLine("\tUniCast: {0}", unicast.Address); } } } 

Probablemente estés más interesado en UnicastAddresses.

El uso de Dns requiere que su computadora esté registrada con el servidor DNS local, lo que no necesariamente es cierto si está en una intranet, y menos aún si está en su casa con un ISP. También requiere un viaje de ida y vuelta de la red, todo para encontrar información sobre su propia computadora.

La forma correcta:

 NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach(NetworkInterface adapter in nics) { foreach(var x in adapter.GetIPProperties().UnicastAddresses) { if (x.Address.AddressFamily == AddressFamily.InterNetwork && x.IsDnsEligible) { Console.WriteLine(" IPAddress ........ : {0:x}", x.Address.ToString()); } } } 

(ACTUALIZACIÓN 31-Jul-2015: Se corrigieron algunos problemas con el código)

O para aquellos a los que les gusta solo una línea de Linq:

 NetworkInterface.GetAllNetworkInterfaces() .SelectMany(adapter=> adapter.GetIPProperties().UnicastAddresses) .Where(adr=>adr.Address.AddressFamily == AddressFamily.InterNetwork && adr.IsDnsEligible) .Select (adr => adr.Address.ToString()); 

Como una máquina puede tener múltiples direcciones IP, la forma correcta de descubrir su dirección IP que va a usar para enrutar a Internet general es abrir un socket a un host en Internet, luego inspeccionar la conexión del socket a vea cuál es la dirección local que se está utilizando en esa conexión.

Al inspeccionar la conexión del zócalo, podrá tener en cuenta tablas de enrutamiento raras, múltiples direcciones IP y nombres de host maliciosos. El truco con el nombre de host anterior puede funcionar, pero no lo consideraría completamente confiable.

Si sabe que hay una o más direcciones IPv4 para su computadora, esta proporcionará una de ellas:

 Dns.GetHostAddresses(Dns.GetHostName()) .First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString() 

GetHostAddresses normalmente bloquea el hilo de llamada mientras consulta el servidor DNS, y lanza una SocketException si la consulta falla. No sé si se salta la llamada de red cuando busca su propio nombre de host.