以下是从本地系统构建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!?");
}
}
}
}
}
答案 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。我多次重现了这个问题。