C#: фильтрация ip-адресов

193
30 мая 2018, 14:40

В программе нужно получить свой ip адрес. Делаю это такой функцией:

public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    return null;
}

Но существует следующая проблема: Если на машине установлен виртуальный сетевой адаптер (например, от VirtualBox), то функция выдаёт его ip-адрес.

Можно ли как-нибудь отфильтровать виртуальные адаптеры?

Answer 1

Добавьте ссылку на System.Management и используйте WMI-запрос к классу Win32_NetworkAdapter, у реальных интерфейсов должно быть PhysicalAdapter=true. Для получения Guid интерфейса можно использовать NetworkInterface.GetAllNetworkInterfaces(). Как-то так:

using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Management;
...
//Определяет, является ли адаптер физическим
public static bool IsAdapterPhysical(string guid)
{
    ManagementObjectCollection mbsList = null;            
    ManagementObjectSearcher mbs = new ManagementObjectSearcher(
    "SELECT PhysicalAdapter FROM Win32_NetworkAdapter WHERE GUID = '" + guid + "'"
    );
    bool res = false;
    using (mbs)
    {
        mbsList = mbs.Get();
        foreach (ManagementObject mo in mbsList)
        {                  
            foreach (var p in mo.Properties)
            {                        
                if (p.Value != null)
                {
                    res = (bool)p.Value;
                    break;
                }
                else res = false;                        
            }                    
        }
        return res;
    }
}
//Получает все локальные IP-адреса
public static List<IPAddress> GetIpAddresses()
{
    List<IPAddress> res = new List<IPAddress>(10);
    var ifs = NetworkInterface.GetAllNetworkInterfaces();
    foreach (var interf in ifs)
    {
        var ipprop=interf.GetIPProperties();
        if (ipprop == null) continue;
        var unicast = ipprop.UnicastAddresses;
        if (unicast == null) continue;
        if (IsAdapterPhysical(interf.Id.ToString()))
        {
            //находим первый Unicast-адрес
            foreach (var addr in unicast)
            {
                if (addr.Address.AddressFamily != AddressFamily.InterNetwork) continue;
                res.Add(addr.Address);
                break;
            }
        }
    }
    return res;
}
READ ALSO
Изменение данных в XML файле

Изменение данных в XML файле

Достаю из xml файла список учеников, хочу удалить одного из них и записать измененияВот так это выглядит:

177
c# проблема с подключением проекта

c# проблема с подключением проекта

У меня в solution имеется два проектаОдин textEdit, второй textEdit

171
Вывод изображения в представлении ASP.NET MVC

Вывод изображения в представлении ASP.NET MVC

В контроллере у меня есть два метода, Get и PostВ представлении первого создана форма, в которой пользователь загружает изображение и текстовый...

262
Как получить список всех полей значимых типов у класса?

Как получить список всех полей значимых типов у класса?

Недавно открыл для себя даппер и теперь пишу свой репозиторий(велосипед) для негоВ ходе написания встала необходимость получить список всех...

190