Como faço para obter o endereço IP da rede local de um computador por meio de programação?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu preciso para obter o endereço IP da rede local real do computador (por exemplo, 192.168.0.220) do meu programa usando C # e .NET 3.5. Eu não posso simplesmente usar 127.0.0.1 neste caso.

Qual é a melhor maneira de fazer isso?

Foi útil?

Solução

Fazer a ligação Ele diz que não, adicione System.net, e usando o seguinte

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

Outras dicas

Se você está procurando o tipo de informações que o utilitário de linha de comando, ipconfig, pode fornecer, você provavelmente deve estar usando o namespace System.Net.NetworkInformation.

Este código de exemplo irá enumerar todas as interfaces de rede e despejar os endereços conhecidos 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);
        }
    }
}

Você é provavelmente mais interessados ??nos UnicastAddresses.

usando o DNS requer que o computador ser registrado com o servidor DNS local, o que não é necessariamente verdade se você estiver em uma intranet, e ainda menos provável se você estiver em casa com um ISP. Também exige uma ida e volta rede -. Tudo para descobrir informações sobre o seu próprio computador

A maneira correta:

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

(ATUALIZAÇÃO 31-Jul-2015: Corrigido alguns problemas com o código)

Ou para aqueles que gostam apenas uma linha de Linq:

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

Como uma máquina pode ter vários endereços IP, a maneira correta de descobrir o seu endereço IP que você vai estar usando a rota para a internet em geral é para abrir um soquete para um host na internet, em seguida, inspecionar o conexão de soquete para ver o que o endereço local que está sendo usado neste contexto é.

Ao inspecionar a conexão de soquete, você será capaz de levar em conta as tabelas de roteamento estranho, vários endereços IP e nomes de host malucas. O truque com o nome da máquina acima trabalho pode, mas eu não iria considerá-la inteiramente confiável.

Se você sabe que há um ou mais endereços IPv4 para o seu computador, este irá fornecer um deles:

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

GetHostAddresses normalmente bloqueia o segmento de chamada enquanto ele consulta o servidor DNS, e lança um SocketException se a consulta falha. Eu não sei se ele ignora a chamada rede quando se olha o seu próprio nome de host.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top