Я знаю, що це може бити мертвим конем, але, можливо, це може комусь допомогти. Я шукав всюди спосіб, як знайти свою локальну 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.
Сподіваюся, це комусь допоможе! :-)
Редагувати:
Було вказано (дякую @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
Це твердження здається суперечливим. Ви намагаєтеся з’ясувати, чи ваш комп'ютер підключений до приватної локальної мережі чи Інтернету?