【问题标题】:GetIpAddrTable Returned Adapter List Differs from GetAdaptersAddressesGetIpAddrTable 返回的适配器列表与 GetAdaptersAddresses 不同
【发布时间】:2012-11-26 20:54:33
【问题描述】:

返回不同的适配器列表

我想知道为什么GetIpAddrTable 返回的网络适配器比GetAdaptersAddresses 少的根本原因。候选原因如下(根据答案更新)。

候选人原因

  • IPv6 适配器:这些只会出现在GetAdaptersAddresses。在此示例中,我有一个适配器的情况,该适配器具有 IPv4 和 IPv6 的链路本地 IP 地址,它没有显示在 GetIpAddrTable 的输出中。

背景

我正在调查运行 Windows 7 64 位家庭高级版(版本:6.1.7601 Service Pack 1 Build 7601)的特定戴尔笔记本电脑上的 GetIpAddrTable 功能问题。有问题的系统无法通过GetIpAddrTable 检测到某些网络适配器。诊断结果如下。

谁能解释为什么我会从这两个函数中看到如此截然不同的结果?我们已经使用GetIpAddrTable 将近两年了,没有任何问题。

文档检查

GetIpAddrTabledocumentation 表示链接状态检测可能会导致 XP 出现问题,但它没有给出任何适配器根本不显示的原因。 似乎不包括虚拟适配器,但我们的设备不是虚拟适配器(它是基于 USB 的以太网)。

在 Windows Server 2008 和 Windows Vista 上,返回的 IPv4 地址 通过 GetIpAddrTable 函数不受媒体感应的影响 本地计算机上 TCP/IP 堆栈的功能。 GetIpAddrTable 函数只返回有效的 IPv4 地址。

在我对该系统进行的测试中,我们有一个有效的连接,但它仅由GetAdaptersAddresses 报告,而不是GetIpAddrTable。我怀疑 Windows 认为适配器无效,但我不确定要测试什么来确认这个理论。数据包进出设备,只是在 IPv4 地址映射表中不可见。

实现细节

  • 我们使用Belcarra USBLAN ethernet gadget driver(为我们公司定制)
  • 我们希望我们的设备通过 DHCP 为主机和设备注册
  • 驱动提供DHCP
  • 我们的第一个主机适配器是 169.254.142.9
  • 我们的第一个设备适配器是 169.254.142.10
  • 到我们设备的流量未路由到外部(链接本地)

GetIpAddrTable 结果

通常我们希望看到两个或三个网络适配器,而不是环回适配器。可能此列表中存在 127.0.0.1 是问题的一部分 - 通常不会在正常工作的机器上观察到。

  • 适配器 1:软件环回接口 1
  • 适配器 2:Intel(R) Centrino(R) Wireless-N 1030

GetAdaptersAddresses 结果

我已经按照返回的顺序列出了此函数返回的适配器。 强调来自第一次调用的匹配适配器。 ipconfig 输出中唯一不存在的适配器是粗体

  • 适配器 1:USBLAN 适配器
  • 适配器 2:Microsoft 虚拟 WiFi 微型端口适配器
  • 适配器 3:蓝牙设备(个人局域网)
  • 适配器 4:Intel(R) Centrino(R) Wireless-N 1030
  • 适配器 5:Realtek PCIe GBE 系列控制器
  • 适配器 6:软件环回接口 1
  • 适配器 7:Microsoft ISATAP 适配器
  • 适配器 8:Microsoft ISATAP 适配器 #2
  • 适配器 9:Teredo 隧道伪接口
  • 适配器 10:Microsoft ISATAP 适配器 #3
  • 适配器 11:Microsoft ISATAP 适配器 #4
  • 适配器 12:Microsoft ISATAP 适配器 #5

ipconfig /all 结果

请注意,软件环回适配器是唯一不存在的 - 这表明 ipconfig 在内部使用第二个函数或类似接口。

  • 适配器 1:USBLAN 适配器
  • 适配器 2:Microsoft 虚拟 WiFi 微型端口适配器
  • 适配器 3:蓝牙设备(个人局域网)
  • 适配器 4:Intel(R) Centrino(R) Wireless-N 1030
  • 适配器 5:Realtek PCIe GBE 系列控制器
  • 适配器 6:Microsoft ISATAP 适配器
  • 适配器 7:Microsoft ISATAP 适配器 #2
  • 适配器 8:Teredo 隧道伪接口
  • 适配器 9:Microsoft ISATAP 适配器 #3
  • 适配器 10:Microsoft ISATAP 适配器 #4
  • 适配器 11:Microsoft ISATAP 适配器 #5

交叉引用结果

似乎ipconfig /all 命令返回的数据与GetAdaptersAddresses 相同,但软件环回接口除外。我目前正在考虑将我们的库切换为使用 GetAdaptersAddresses 以解决此问题,但我担心为什么 GetIpAddrTable 没有返回预期结果。提前感谢您的任何意见!

相关问题

【问题讨论】:

    标签: windows winapi networking


    【解决方案1】:

    GetIpAddrTable() 只返回 IPv4 接口。

    GetAdaptersAddresses() 返回 IPv4 和/或 IPv6 适配器,单个适配器可以分配多个 IP 地址。

    你在比较苹果和橘子,想知道为什么你的苹果比橘子少。

    【讨论】:

    • 除非在这种情况下,所讨论的适配器不是纯 IPv6 适配器。我们注册一个 IPv4 地址(参见有关 IP 地址分配的问题的 cmets)。我们只使用 IPv4 本地链路接口。
    • 将此标记为唯一可行的答案 - 这似乎合乎逻辑。
    • 更新:我现在已经确认这是真正的原因。通过 GetAdaptersAddresses 查询 IPv4 接口也会跳过我们在相关系统上的适配器。
    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 2021-01-28
    • 1970-01-01
    • 2023-01-05
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多