1

以下是从本地系统构建 IP 地址及其子网掩码列表的代码部分,但是警告功能似乎会定期触发,这在理论上应该是不可能的 - 因为它不应该有 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

4 回答 4

1

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

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

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

于 2010-10-05T13:29:52.293 回答
1

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

这似乎已在 .Net 4.0 中修复

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

于 2014-10-29T13:55:40.650 回答
0

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

你能检查一下有问题的接口的子网掩码是否是有类的吗?即,对于那些IPv4Mask为空的接口地址,它们是分别具有/8、/16 和/24 网络掩码的A、B 和C 类地址吗?

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

于 2009-05-23T09:14:59.947 回答
0

我刚刚遇到的一个原因:

我使用 .NET 框架 4 客户端配置文件,IPv4Mask 与我配合得很好。切换到 .NET 框架 2 或 3.5 时,它返回 NULL。我多次重现了这个问题。

于 2016-07-26T15:24:25.567 回答