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:
Dns.GetHostEntry(Dns.GetHostName());
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.
public string GetLocalIPv4(NetworkInterfaceType _type)
{
string output = "";
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
output = ip.Address.ToString();
}
}
}
}
return output;
}
Agora, para obter o endereço IPv4 da sua chamada à interface de rede Ethernet:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
Ou sua interface sem fio:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
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:
public static string[] GetAllLocalIPv4(NetworkInterfaceType _type)
{
List<string> ipAddrList = new List<string>();
foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
{
foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddrList.Add(ip.Address.ToString());
}
}
}
}
return ipAddrList.ToArray();
}
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.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
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?