Bunun ölü bir atı tekmelemek olabileceğini biliyorum, ama belki bu birine yardım edebilir. Yerel IP adresimi bulmak için her yere baktım, ancak bulduğum her yerde kullanmak diyor:
Dns.GetHostEntry(Dns.GetHostName());
Bunu hiç sevmiyorum çünkü sadece bilgisayarınıza atanan tüm adresleri alıyor. Birden fazla ağ arabiriminiz varsa (hemen hemen tüm bilgisayarlar günümüzde bunu yapmaktadır) hangi ağ arabirimiyle hangi adresin gittiğini bilmiyorsunuz. Bir sürü araştırma yaptıktan sonra, NetworkInterface sınıfını kullanmak için bir işlev oluşturdum ve bilgiyi bundan çıkardım. Bu şekilde ne tür bir arayüz olduğunu (Ethernet, kablosuz, geridöngü, tünel vb.), Aktif olup olmadığını ve SOOO'yu çok daha fazla söyleyebilirim.
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;
}
Şimdi Ethernet ağ arayüzü çağrınızın IPv4 adresini almak için:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
Veya Kablosuz arayüzünüz:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Kablosuz arabirim için IPv4 adresi almaya çalışırsanız, ancak bilgisayarınızda kablosuz kart takılı değilse, boş bir dize döndürür. Ethernet arayüzü ile aynı şey.
Umarım bu birine yardımcı olur! :-)
DÜZENLE:
Bu işlev, IP adresini kullanmaktan çok daha iyi bir şekilde çıkarmaya devam etmesine rağmen Dns.GetHostEntry(Dns.GetHostName())
, tek bir arabirimde aynı türden birden fazla arabirimi veya birden çok IP adresini desteklemede çok iyi sonuç vermediğine dikkat çekti (teşekkürler @NasBanov). . Yalnızca birden fazla adres atanmışsa tek bir IP adresi döndürür. Atanan bu adreslerin TÜMÜ'nü döndürmek için, orijinal işlevi, tek bir dize yerine her zaman bir dizi döndürecek şekilde değiştirebilirsiniz. Örneğin:
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();
}
Şimdi bu işlev belirli bir arabirim türü için TÜM atanmış adresleri döndürecektir. Şimdi sadece tek bir dize almak .FirstOrDefault()
için, dizideki ilk öğeyi döndürmek için uzantıyı kullanabilirsiniz veya boşsa boş bir dize döndürebilirsiniz.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
Bu ifade çelişkili görünüyor. Bilgisayarınızın özel bir LAN'a veya İnternet'e bağlı olup olmadığını anlamaya mı çalışıyorsunuz?