为什么UnicastIPAddressInformation.IPv4Mask在IPv4地址上返回null?

时间:2009-05-23 08:45:37

标签: .net network-programming subnet

以下是从本地系统构建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 个答案:

答案 0 :(得分:1)

这是因为你遇到了一个环回适配器。即127.0.0.1这些将IPv4Mask设置为null。请参阅ni.Name以查看我是否正确。

要检查环回适配器,请执行...

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

答案 1 :(得分:1)

当网络关闭时,IPv4Mask返回null(请参阅ni.OperationalStatus),在迭代GetAllNetworkInterfaces()返回的所有内容时,您经常会遇到这种情况。

这似乎已在.Net 4.0中修复

有时可以推断出面具,例如所有以169.254开头的IP地址(这是Windows在DHCP失败时会选择的)的掩码为255.255.0.0

答案 2 :(得分:0)

这很奇怪;显然,这种语义并不是人们可以合理预期的。

您是否可以检查相关接口的子网掩码是否有问题?即,对于那些IPv4Mask为空的接口地址,它们是A,B和C类地址,网络掩码分别为/ 8,/ 16和/ 24吗?

也许这个函数并不是CIDR世界的成员,它们实际上只是“子网”掩码;假定没有一个地址的地址使用有类网络掩码。

答案 3 :(得分:0)

我刚遇到的一个原因:

我使用.NET framework 4 Client profile,IPv4Mask和我一起工作得很好。切换到.NET framework 2或3.5时,它返回NULL。我多次重现了这个问题。