Na internet, existem vários locais que mostram como obter um endereço IP. E muitos deles se parecem com este exemplo:
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();
Neste exemplo, obtenho vários endereços IP, mas só estou interessado em obter o que o roteador atribui ao computador executando o programa: o IP que eu daria a alguém se ele desejar acessar uma pasta compartilhada no meu computador para instância.
Se eu não estiver conectado a uma rede e estiver conectado à Internet diretamente através de um modem sem roteador, gostaria de receber um erro. Como posso ver se meu computador está conectado a uma rede com C # e se é para obter o endereço IP da LAN.
c#
networking
Tono Nam
fonte
fonte
If I am not connected to a network and I am connected to the internet
Esta afirmação parece contraditória. Você está tentando descobrir se o seu computador está conectado a uma LAN privada ou à Internet?Respostas:
Para obter o endereço IP local:
Para verificar se você está conectado ou não:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
fonte
Existe uma maneira mais precisa quando existem endereços IP múltiplos disponíveis na máquina local.
Connect
um soquete UDP e leia seu terminal local:Connect
em um soquete UDP tem o seguinte efeito: define o destino paraSend
/Recv
, descarta todos os pacotes de outros endereços e - que é o que usamos - transfere o soquete para o estado "conectado", define seus campos apropriados. Isso inclui verificar a existência da rota para o destino de acordo com a tabela de roteamento do sistema e definir o terminal local de acordo. A última parte parece não estar oficialmente documentada, mas parece uma característica integrante da API de soquetes de Berkeley (um efeito colateral do estado "conectado" do UDP) que funciona de maneira confiável no Windows e Linux em versões e distribuições.Portanto, esse método fornecerá o endereço local que seria usado para conectar-se ao host remoto especificado. Não há uma conexão real estabelecida; portanto, o ip remoto especificado pode estar inacessível.
fonte
Refatorando o código de Mrcheif para alavancar o Linq (ou seja, .Net 3.0+). .
:)
fonte
Eu sei que isso pode estar chutando um cavalo morto, mas talvez isso possa ajudar alguém. Procurei em todo o lugar uma maneira de encontrar meu endereço IP local, mas em todos os lugares que encontro diz para usar:
Não gosto nada disso, porque apenas obtém todos os endereços atribuídos ao seu computador. Se você possui várias interfaces de rede (o que praticamente todos os computadores têm atualmente), você não tem idéia de qual endereço combina com qual interface de rede. Depois de fazer várias pesquisas, criei uma função para usar a classe NetworkInterface e arrancar as informações dela. Dessa forma, posso dizer que tipo de interface é (Ethernet, sem fio, loopback, túnel etc.), se está ativa ou não, e SOOO muito mais.
Agora, para obter o endereço IPv4 da sua chamada à interface de rede Ethernet:
Ou sua interface sem fio:
Se você tentar obter um endereço IPv4 para uma interface sem fio, mas o computador não tiver uma placa sem fio instalada, apenas retornará uma string vazia. A mesma coisa com a interface Ethernet.
Espero que isso ajude alguém! :-)
EDITAR:
Observou-se (obrigado @NasBanov) que, embora essa função extraia o endereço IP de uma maneira muito melhor do que usá-
Dns.GetHostEntry(Dns.GetHostName())
la, ela não funciona muito bem no suporte a várias interfaces do mesmo tipo ou a vários endereços IP em uma única interface . Ele retornará apenas um único endereço IP quando houver vários endereços atribuídos. Para retornar TODOS esses endereços atribuídos, você pode simplesmente manipular a função original para sempre retornar uma matriz em vez de uma única string. Por exemplo:Agora, esta função retornará TODOS os endereços atribuídos para um tipo de interface específico. Agora, para obter apenas uma única string, você pode usar a
.FirstOrDefault()
extensão para retornar o primeiro item da matriz ou, se estiver vazio, retornar uma string vazia.fonte
item.OperationalStatus
sempre retornaUnknown
.Aqui está uma versão modificada (do compman2408) que funcionou para mim:
Você pode chamar esse método, por exemplo, como:
A mudança: estou recuperando o IP de um adaptador que possui um IP de gateway atribuído a ele. Segunda alteração: eu adicionei docstrings e break statement para tornar esse método mais eficiente.
fonte
break
no mais internoif
ou umreturn
faria o truque.Este é o melhor código que encontrei para obter o IP atual, evitando obter o host VMWare ou outro endereço IP inválido.
fonte
Eu acho que usar o LinQ é mais fácil:
fonte
Para rir, pensei em tentar obter uma única instrução LINQ usando o novo operador condicional nulo C # 6. Parece muito louco e provavelmente terrivelmente ineficiente, mas funciona.
Cortesia lógica
Gerardo H
(e por referênciacompman2408
).fonte
Outra maneira de obter IP usando a expressão linq:
fonte
@ mrcheif Encontrei esta resposta hoje e foi muito útil, embora tenha retornado um IP errado (não devido ao código não funcionar), mas deu o IP de internetwork errado quando você tem coisas como o Himachi em execução.
fonte
192.0.0.0/8
não ser um teste correto para um endereço IP privado (existem três intervalos, todos diferentes deste), pode ser um intervalo de rede corporativa, portanto, não tanto "local".Testado com uma ou várias placas de rede local e máquinas virtuais
fonte
Apenas uma versão atualizada minha usando o LINQ:
fonte
Pré-requisitos: você deve adicionar a referência System.Data.Linq e referenciá-la
fonte
Eu também estava lutando para obter o IP correto.
Tentei uma variedade de soluções aqui, mas nenhuma me proporcionou o efeito desejado. Quase todos os testes condicionais fornecidos não fizeram com que nenhum endereço fosse usado.
Isto é o que funcionou para mim, espero que ajude ...
fonte
fonte
Lembre-se de que, no caso geral, você pode ter várias traduções NAT em andamento e vários servidores DNS, cada um operando em diferentes níveis de tradução NAT.
E se você tiver NAT de classe de operadora e quiser se comunicar com outros clientes da mesma operadora? No caso geral, você nunca sabe ao certo porque pode aparecer com nomes de host diferentes a cada tradução NAT.
fonte
Obsoleto se foi, isso funciona para mim
fonte
Atualizando a resposta de Mrchief com o Linq, teremos:
fonte
Isso retorna endereços de qualquer interface que tenha endereços de gateway e endereços unicast em duas listas separadas, IPV4 e IPV6.
fonte
Já existem muitas respostas, mas ainda estou contribuindo com a minha:
Um forro:
Observação: pesquise da última porque ainda funcionou após algumas interfaces adicionadas ao dispositivo, como MobileHotspot, VPN ou outros adaptadores virtuais sofisticados.
fonte
Além disso, apenas um código simples para obter o IP do cliente:
Espero que ajude você.
fonte
fonte
Código do compman2408 modificado para poder percorrer cada um
NetworkInterfaceType
.E você pode chamar assim:
fonte
Abaixo da mesma ação
Função IP Local ()
Dim Host como String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Host
Return True
Função final
fonte
uma linha de código: D
fonte
Se você possui máquinas virtuais ou placas de rede extras, pode haver outros valores na lista de endereços. Minha sugestão é verificar as entradas da lista de endereços e imprimir, conforme apropriado. No meu caso, a entrada 3 era o endereço ipv4 da minha máquina
Não esqueça de adicionar
using System.Net;
fonte