Estou executando um servidor e quero exibir meu próprio endereço IP.
Qual é a sintaxe para obter o endereço IP do computador (se possível, externo)?
Alguém escreveu o seguinte código.
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
No entanto, geralmente desconfio do autor e não entendo esse código. Existe uma maneira melhor de fazer isso?
c#
ip-address
Nefzen
fonte
fonte
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Respostas:
Não, essa é praticamente a melhor maneira de fazer isso. Como uma máquina pode ter vários endereços IP, é necessário iterar a coleção deles para encontrar o endereço correto.
Edit: A única coisa que eu iria alterar seria para mudar isso:
para isso:
Não há necessidade de
ToString
uma enumeração para comparação.fonte
break
declaração após a descoberta do IP para evitar iterações desnecessárias durante a coleta (neste caso, duvido que o impacto no desempenho tenha importância, mas gosto de enfatizar bons hábitos de codificação)A única maneira de conhecer seu IP público é pedir a alguém que lhe diga; este código pode ajudá-lo:
fonte
Líquido de limpeza e uma solução completa: D
fonte
Se você não pode confiar em obter seu endereço IP de um servidor DNS (o que aconteceu comigo), use a seguinte abordagem:
O espaço para nome System.Net.NetworkInformation contém uma classe NetworkInterface , que possui um método estático GetAllNetworkInterfaces .
Este método retornará todas as "interfaces de rede" em sua máquina e geralmente há algumas, mesmo se você tiver apenas um adaptador sem fio e / ou um hardware de adaptador Ethernet instalado em sua máquina. Todas essas interfaces de rede possuem endereços IP válidos para sua máquina local, embora você provavelmente deseje apenas um.
Se você estiver procurando um endereço IP, precisará filtrar a lista até identificar o endereço correto. Você provavelmente precisará fazer algumas experiências, mas tive sucesso com a seguinte abordagem:
OperationalStatus == OperationalStatus.Up
. Isso excluirá seu adaptador Ethernet físico, por exemplo, se você não tiver um cabo de rede conectado.Para cada NetworkInterface, você pode obter um objeto IPInterfaceProperties usando o método GetIPProperties e, a partir de um objeto IPInterfaceProperties, você pode acessar a propriedade UnicastAddresses para obter uma lista de objetos UnicastIPAddressInformation .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.Neste ponto, pego o endereço do primeiro (se houver) endereço unicast que corresponde a todos esses filtros.
EDITAR:
[código revisado em 16 de maio de 2018 para incluir as condições mencionadas no texto acima para estado de detecção de endereço duplicado e vida útil preferida]
A amostra abaixo demonstra a filtragem com base no status operacional, família de endereços, excluindo o endereço de loopback (127.0.0.1), estado de detecção de endereço duplicado e vida útil preferida.
fonte
fonte
Acabei de testar isso na minha máquina e funciona.
fonte
Se você deseja evitar o uso do DNS:
fonte
Não confie na InterNetwork o tempo todo, pois você pode ter mais de um dispositivo que também usa IP4, o que prejudicaria os resultados na obtenção do seu IP. Agora, se você quiser, basta copiar e revisar ou atualizar para o que achar melhor.
Primeiro, obtenho o endereço do roteador (gateway) Se voltar a estar conectado a um gateway (o que significa que não está conectado diretamente ao modem sem fio ou não), teremos o endereço de gateway como IPAddress, caso contrário, um ponteiro nulo. .
Em seguida, precisamos obter a lista de endereços IP do computador. É aqui que as coisas não são tão difíceis porque os roteadores (todos os roteadores) usam 4 bytes (...). Os três primeiros são os mais importantes porque qualquer computador conectado a ele terá o endereço IP4 correspondente aos três primeiros bytes. Ex: 192.168.0.1 é padrão para o IP padrão do roteador, a menos que seja alterado pelo administrador do mesmo. '192.168.0' ou o que quer que seja, é o que precisamos igualar. E foi tudo o que fiz na função IsAddressOfGateway. O motivo da correspondência de comprimento é porque nem todos os endereços (que são apenas para o computador) têm o comprimento de 4 bytes. Se você digitar netstat no cmd, verá que isso é verdade. Então aí está. Sim, é preciso um pouco mais de trabalho para realmente obter o que você está procurando. Processo de eliminação. E pelo amor de Deus, não encontre o endereço executando ping, o que leva tempo, porque primeiro você está enviando o endereço a ser pingado e, em seguida, ele deve enviar o resultado de volta. Não, trabalhe diretamente com as classes .Net que lidam com o ambiente do sistema e você obterá as respostas que estiver procurando quando tiver apenas a ver com o seu computador.
Agora, se você estiver conectado diretamente ao seu modem, o processo é quase o mesmo, porque o modem é seu gateway, mas a sub-máscara não é a mesma, porque você obtém as informações diretamente do seu servidor DNS via modem e não é mascarado pelo roteador que atende o Internet para você, embora você ainda possa usar o mesmo código porque o último byte do IP atribuído ao modem é 1. Portanto, se o IP enviado do modem que muda for 111.111.111.1 ', você receberá 111.111.111. valor de bytes). Lembre-se de que precisamos encontrar as informações do gateway, pois há mais dispositivos que lidam com a conectividade com a Internet do que o seu roteador e modem.
Agora você percebe por que você NÃO altera os dois primeiros bytes 192 e 168 do seu roteador. Eles são estritamente diferenciados apenas para os roteadores e não para a Internet, ou teríamos um problema sério com o Protocolo IP e o ping duplo, resultando na falha do computador. A imagem com o IP do roteador atribuído é 192.168.44.103 e você clica em um site com esse IP também. AMD! Seu computador não saberia o que executar ping. Bater aqui. Para evitar esse problema, somente os roteadores são atribuídos a eles e não para uso da Internet. Portanto, deixe os dois primeiros bytes do roteador em paz.
fonte
255.255.255.0
e o fará de uma maneira bastante complicada IMO.Eu apenas pensei em adicionar minha própria linha única (mesmo que já existam muitas outras respostas úteis).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
fonte
Para obter o endereço IP público atual, tudo que você precisa fazer é criar uma página ASPX com a seguinte linha no evento de carregamento da página:
fonte
Se você estiver executando na intranet, poderá obter o endereço IP da máquina local e, caso contrário, obterá o endereço IP externo com este: Web:
Área de Trabalho:
fonte
Veja aqui detalhes.
Você deve se lembrar que o seu computador pode ter mais de um IP (na verdade, ele sempre tem) - então, qual deles você procura.
fonte
Tente o seguinte:
fonte
Talvez por IP externo você possa considerar (se estiver em um contexto de servidor da Web) usar este
Eu estava fazendo a mesma pergunta que você e a encontrei neste artigo de stackoverflow.
Funcionou para mim.
fonte
fonte
fonte
Linha de código única simples que retorna o primeiro endereço IPV4 interno ou nulo, se não houver nenhum. Adicionado como um comentário acima, mas pode ser útil para alguém (algumas soluções acima retornarão vários endereços que precisam de filtragem adicional).
Também é fácil retornar um loopback em vez de nulo, eu acho que com:
fonte
IPAddress.Loopback
? :)Para encontrar a lista de endereços IP, usei esta solução
Mas eu pessoalmente gosto da solução abaixo para obter um endereço IP válido local
fonte
A solução LINQ:
fonte
Aqui está como eu resolvi isso. Eu sei se você tem várias interfaces físicas isso pode não selecionar o eth exato que você deseja.
fonte
A pergunta não diz ASP.NET MVC, mas estou deixando isso aqui de qualquer maneira:
fonte
Obtenha todos os endereços IP como seqüências de caracteres usando o LINQ:
PARA FILTRAR PRIVADOS ...
Primeiro, defina um método de extensão
IsPrivate()
:... E use-o para filtrar IPs particulares:
fonte
Funciona para mim ... e deve ser mais rápido na maioria dos casos (se não todos) do que consultar um servidor DNS. Obrigado ao Dr. Wily's Apprentice ( aqui ).
Apenas como referência, este é o código de classe completo onde eu o defini:
fonte
Outra maneira de obter seu endereço IP público é usar o
resolve1.opendns.com
servidor do OpenDNSmyip.opendns.com
como a solicitação.Na linha de comando, é:
Ou em C # usando o nuget DNSClient:
Isso é um pouco mais limpo do que atingir pontos de extremidade http e analisar respostas.
fonte
E isso é para obter todos os IPs locais no formato csv no VB.NET
fonte
Para obter o endereço IP remoto da maneira mais rápida possível. Você precisa usar um downloader ou criar um servidor no seu computador.
A desvantagem de usar este código simples: (o que é recomendado) é que levará de 3 a 5 segundos para obter o seu endereço IP remoto, pois o WebClient quando inicializado sempre leva de 3 a 5 segundos para verificar as configurações de proxy.
Aqui está como eu o consertei .. (a primeira vez ainda leva de 3 a 5 segundos), mas depois disso, ele sempre obtém seu endereço IP remoto em 0 a 2 segundos, dependendo da sua conexão.
fonte