¿Cómo obtengo la dirección IP de la red local de una computadora mediante programación?

StackOverflow https://stackoverflow.com/questions/151231

  •  02-07-2019
  •  | 
  •  

Pregunta

Necesito obtener la dirección IP de la red local real de la computadora (por ejemplo, 192.168.0.220) de mi programa 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?

¿Fue útil?

Solución

Enlace Dice allí, agregue System.net y use lo siguiente

    //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 ()); 
}

Otros consejos

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

Este código de muestra 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é más interesado en las direcciones Unicast.

El uso de Dns requiere que su computadora esté registrada en el servidor DNS local, lo cual no es necesariamente cierto si está en una intranet, y aún menos probable si está en casa con un ISP. También requiere un viaje de ida y vuelta en 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 quienes 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 averiguar su dirección IP que va a utilizar para enrutar a Internet general es abrir un socket a un host en Internet, luego inspeccionar conexión de socket para ver cuál es la dirección local que se está utilizando en esa conexión.

Al inspeccionar la conexión del socket, podrá tener en cuenta tablas de enrutamiento extrañas, múltiples direcciones IP y nombres de host extravagantes. 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, esto le 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 arroja una SocketException si la consulta falla. No sé si omite la llamada de red cuando busco su propio nombre de host.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top