2009-05-23 86 views
1

下面是一段代码,它建立了来自本地系统的IP地址及其子网掩码列表,但是警告函数似乎会定期触发,理论上这应该是不可能的 - 因为它不应该有一个没有相关子网掩码的IPv4地址[?]。为什么UnicastIPAddressInformation.IPv4Mask在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!?"); 
        } 
       } 
      } 
     } 
    } 

回答

0

这很奇怪;显然这个语义并不完全可以合理预期。

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

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

1

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

要检查环回适配器做...

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

1

IPv4Mask返回null当网络出现故障(见ni.OperationalStatus) ,在遍历GetAllNetworkInterfaces()返回的所有内容时,您经常会遇到这种情况。

这似乎已被固定在.NET 4.0

有时掩模可以推断,例如即以169.254(这是在DHCP无法Windows将挑选)开始所有IP地址255.255.0.0有一个面具

0

一个原因我刚刚碰到:

我使用.NET Framework 4的客户端配置文件,IPv4Mask和我一起工作得很好。当切换到.NET Framework 2或3.5时,它返回NULL。我多次重复了这个问题。

相关问题