Я знаю, что это может ударить мертвую лошадь, но, возможно, это может кому-то помочь. Я искал повсюду способ найти свой локальный 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-адрес вызова сетевого интерфейса Ethernet:
GetLocalIPv4(NetworkInterfaceType.Ethernet);
Или ваш беспроводной интерфейс:
GetLocalIPv4(NetworkInterfaceType.Wireless80211);
Если вы попытаетесь получить IPv4-адрес для беспроводного интерфейса, но на вашем компьютере не установлена беспроводная карта, он просто вернет пустую строку. То же самое с интерфейсом Ethernet.
Надеюсь, это кому-нибудь поможет! : -)
EDIT:
Было отмечено (спасибо @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();