【问题标题】:Why does UnicastIPAddressInformation.IPv4Mask return null on an IPv4 Address?为什么 UnicastIPAddressInformation.IPv4Mask 在 IPv4 地址上返回 null?
【发布时间】:2009-05-23 08:45:36
【问题描述】:

以下是从本地系统构建 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!?");
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: .net network-programming subnet


    【解决方案1】:

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

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

    如果 (ni.NetworkInterfaceType != NetworkInterfaceType.Loopback) ...

    【讨论】:

      【解决方案2】:

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

      这似乎已在 .Net 4.0 中修复

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          我刚刚遇到的一个原因:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-05
            • 2011-02-25
            • 2012-01-03
            • 1970-01-01
            • 2019-07-07
            • 2013-09-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多