2008-09-29 19 views

Respuesta

25

Link Se dice allí, añadir System.net, y utilizando la 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()); 
} 
+0

¿Qué dirección IP de la matriz que recibe es la correcta? – EBGreen

+6

GetHostByName se muestra como obsoleto. terminó usando: IPAddress [] ipAddress = Dns.GetHostAddresses (strHostName); logra lo mismo. –

+12

Además, la notación húngara está casi muerta en este punto. Use la cadena hostName. –

11

Como una máquina puede tener varias direcciones IP, la forma correcta de averiguar su dirección IP que se va a utilizar para enrutar a Internet general es abrir un socket a un host en Internet, luego inspeccionar la 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 zócalo, podrá tener en cuenta tablas de enrutamiento raras, direcciones IP múltiples y nombres de host maliciosos. El truco con el nombre de host anterior puede funcionar, pero no lo consideraría completamente confiable.

36

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 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 le interesen más las UnicastAddresses.

24

El uso de Dns requiere que su computadora esté registrada con el servidor DNS local, lo que no es necesariamente 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 han solucionado algunos problemas con el código)

o para aquellos que les gusta sólo 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()); 
+0

hey James, ha 'NetworkInformation' de su línea de respuesta no: 2, compilador de C# diciendo" tipo o espacio de nombres no se pudo encontrar ", he importado' System.Net.NetworkInformation' ya entonces también está diciendo "tipo o espacio de nombres faltante" , Cual es el trato ? – FosterZ

+1

@FosterZ: Estoy de acuerdo (no funciona como está). Implementé este código como: 'foreach (NetworkInterface ni nics) {foreach (UnicastIPAddressInformation x en ni.GetIPProperties(). UnicastAddresses) {if (x.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) {Console .WriteLine ("IPAddress ........: {0: x}", x.Address.ToString()); }}} 'e imprimió una mezcla de la mayoría de mis direcciones IP reales y algunas otras direcciones no-mi-ip. – user664939

1

Si sabe que hay una o más direcciones IPv4 para su computadora, 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 un SocketException si la consulta falla. No sé si se salta la llamada de red cuando busca su propio nombre de host.

Cuestiones relacionadas