Почему UnicastIPAddressInformation.IPv4Mask возвращает ноль для IPv4-адреса? - PullRequest
1 голос
/ 23 мая 2009

Ниже приведен раздел кода, который формирует список IP-адресов и их масок подсетей из локальной системы, однако функция Warn, кажется, регулярно запускается, что в теории должно быть невозможным - так как не должно быть возможности иметь адрес IPv4 без соответствующей маски подсети [?].

    static NetworkUtil()
    {
        foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
        {
            foreach (UnicastIPAddressInformation address in ni.GetIPProperties().UnicastAddresses)
            {
                if (address.Address.AddressFamily == AddressFamily.InterNetwork)
                {
                    if (address.IPv4Mask != null)
                    {
                        m_subnets.Add(address.Address, address.IPv4Mask);
                    }
                    else
                    {
                        m_log.Warn("[NetworkUtil] Found IPv4 Address without Subnet Mask!?");
                    }
                }
            }
        }
    }

Ответы [ 4 ]

1 голос
/ 05 октября 2010

Это потому, что вы столкнулись с адаптером обратной связи. т.е. 127.0.0.1. Для них IPv4Mask имеет значение null. Обратитесь к ni.Name, чтобы узнать, прав ли я.

Чтобы проверить наличие петлевого адаптера, выполните ...

if (ni.NetworkInterfaceType! = NetworkInterfaceType.Loopback) ...

1 голос
/ 29 октября 2014

IPv4Mask возвращает ноль, когда сеть не работает (см. Ni.OperationalStatus), с которой вы часто будете сталкиваться при переборе всего, что возвращает GetAllNetworkInterfaces ().

Похоже, что это было исправлено в .Net 4.0

Иногда маски могут быть выведены, например, все IP-адреса, которые начинаются с 169.254 (то, что Windows выберет при сбое DHCP), имеют маску 255.255.0.0

0 голосов
/ 26 июля 2016

Одна причина, с которой я только что столкнулся:

Я использую .NET Framework 4 Профиль клиента, IPv4Mask отлично работал со мной. При переходе на .NET Framework 2 или 3.5, возвращается NULL. Я воспроизвел проблему несколько раз.

0 голосов
/ 23 мая 2009

Это довольно странно; очевидно, семантика этого не совсем то, что можно было бы разумно ожидать.

Можете ли вы проверить, являются ли маски подсетей рассматриваемых интерфейсов классными? Т.е. для тех интерфейсных адресов, где IPv4Mask является нулем, являются ли они адресами классов A, B и C с маской сети / 8, / 16 и / 24 соответственно?

Возможно, эта функция на самом деле не является членом мира CIDR, и они действительно делают только маски "подсети"; предполагается, что адрес без такового использует классную сетевую маску.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...