【问题标题】:Windows 7 vs. XP GetIsNetworkAvailable() difference?Windows 7 与 XP GetIsNetworkAvailable() 的区别?
【发布时间】:2012-06-17 14:41:21
【问题描述】:

我编写了代码以在计算机上使用可用的 IPv4 NIC 卡填充菜单。它已经在 XP 机器上进行了测试,看起来一切都很好(它也是基于 XP 构建的)。

我在 Windows 7 上对其进行了测试,它总是填充 2 个 IP 地址,即使其中一个已断开连接。以下是 Win7 机器的结果:

WLAN 已连接
局域网断开

观察到:显示正确的 WLAN 地址,显示不正确的 LAN 地址(它甚至是连接到 192.168 的不同网络号,但在菜单中填充的 LAN 地址是 169.254)
预期:显示正确的 WLAN 地址,显示无 LAN(已断开连接)
ipconfig 读取 LAN 的“媒体已断开连接”

WLAN 已连接
局域网连接

观察到:显示正确的 WLAN 地址,显示正确的 LAN 地址
预期:显示正确的 WLAN 地址,显示正确的 LAN 地址

ipconfig 读取正确的地址

WLAN 已断开连接
局域网连接

观察到:显示正确的 WLAN 地址,显示正确的 LAN 地址
预期:没有显示 WLAN 地址(已断开连接),显示正确的 LAN
ipconfig 读取 WLAN 的“媒体已断开连接”

这里是代码块:

_adapters.Clear();
if (NetworkInterface.GetIsNetworkAvailable())
{
    NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (NetworkInterface adapter in networkInterfaces)
    {
        foreach (UnicastIPAddressInformation addr in adapter.GetIPProperties().UnicastAddresses)
        {
            //This filters out IPv6 and Loopback NICs
            if (addr.Address.AddressFamily == AddressFamily.InterNetwork
                && adapter.NetworkInterfaceType != NetworkInterfaceType.Loopback) 
            {    //This formats something like: 192.168.1.0 - Ethernet adapter Local Network Connection
                _adapters.Add(addr.Address.ToString() + " - " + adapter.NetworkInterfaceType.ToString() + " adapter " + adapter.Name);
            }
        }
    }
}

在 VS2010 上使用 4.0 .NET 物有所值

【问题讨论】:

  • 标题似乎有点奇怪,因为这个问题与GetIsNetworkAvailable 无关,是吗?
  • 好吧,GetIsNetworkAvailable() 获取所有可用网络连接的接口。如果在 ipconfig 中读取“Media Disconnected”,则认为网络连接不可用不是很直观吗?也许它应该写成“GetIsNetworkCardAvailable()”,但这不取决于我,抱歉。
  • GetIsNetworkAvailable() 返回一个布尔值 - 它表示是否有任何网络可用。您的所有示例都列出了至少一个网络可用的情况。

标签: c# networking network-programming


【解决方案1】:

要查看 NIC 是否已连接,您应该检查 NetworkInterface.OperationalStatus 属性。

局域网断开时的“奇怪”IP地址来自APIPA(自动专用IP寻址)。 Windows Vista 引入的“功能”:

...Windows Vista 中的一项功能,可在 DHCP 服务器不可用时自动为自己配置 IP 地址和子网掩码。 IP 地址范围是 169.254.0.1 到 169.254.255.254,这是专门为 Microsoft 保留的范围。

【讨论】:

  • Microsoft 使用术语 APIPA,但在 IPV4 中使用 169.254.0.0/16 和在 IPV6 中使用 fe80::/64 更一般地称为链接本地地址。 (MS 是原始 RFC 的作者之一,但可以说该范围是“专门为”他们保留的。请参阅 en.wikipedia.org/wiki/Link-local_addresstools.ietf.org/html/rfc3927)。此外,根据 RFC,Win 98 支持本地链接。
  • 感谢您的信息。现在哪个更好的问题是:使用NetworkInterface.OperationalStatus 或解析并排除 169.254 地址——或者它们可以互换吗?
  • @LynnCrumbling 这是来自 TechNet 的引述……他们有点……以自我为中心!哈哈
  • @klut 169.254.xx 甚至可以是一个有效的地址(只是没有 DHCP)但可以运行(这并不意味着 NIC 已断开连接)。跨度>
  • @Adriano:啊,我很好奇你是从哪里弄来的。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多