Я знаю, что это может ударить мертвую лошадь, но, возможно, это может кому-то помочь. Я искал повсюду способ найти свой локальный IP-адрес, но везде, где я нахожу, написано:
Dns.GetHostEntry(Dns.GetHostName());
Мне это совсем не нравится, потому что он просто получает все адреса, назначенные вашему компьютеру. Если у вас есть несколько сетевых интерфейсов (что почти все компьютеры делают в настоящее время), вы не знаете, какой адрес соответствует какому сетевому интерфейсу. Проведя кучу исследований, я создал функцию для использования класса NetworkInterface и извлечения из него информации. Таким образом, я могу сказать, какой это тип интерфейса (Ethernet, беспроводной, шлейфовый, туннельный и т. Д.), Активен он или нет, и SOOO гораздо больше.
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;
}
Теперь, чтобы получить IPv4-адрес вашего сетевого интерфейса вызова:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
Или ваш беспроводной интерфейс:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Если вы попытаетесь получить IPv4-адрес для беспроводного интерфейса, но на вашем компьютере не установлена беспроводная карта, он просто вернет пустую строку. То же самое с интерфейсом Ethernet.
Надеюсь, это поможет кому-то! :-)
РЕДАКТИРОВАТЬ:
Было отмечено (спасибо @NasBanov), что даже несмотря на то, что эта функция позволяет извлекать IP-адрес гораздо лучше, чем Dns.GetHostEntry(Dns.GetHostName())
его использование, она не очень хорошо справляется с поддержкой нескольких интерфейсов одного типа или нескольких IP-адресов на одном интерфейсе. , Он вернет только один IP-адрес, когда может быть назначено несколько адресов. Чтобы вернуть ВСЕ из этих назначенных адресов, вы можете просто манипулировать исходной функцией, чтобы всегда возвращать массив вместо одной строки. Например:
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();
}
Теперь эта функция будет возвращать ВСЕ назначенные адреса для определенного типа интерфейса. Теперь, чтобы получить только одну строку, вы можете использовать .FirstOrDefault()
расширение, чтобы вернуть первый элемент в массиве, или, если оно пустое, вернуть пустую строку.
GetLocalIPv4(NetworkInterfaceType.Ethernet).FirstOrDefault();
If I am not connected to a network and I am connected to the internet
Это утверждение кажется противоречивым. Вы пытаетесь выяснить, подключен ли ваш компьютер к частной локальной сети или Интернету?