Como faço para obter o endereço IP da rede local de um computador por meio de programação?
-
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?
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.