2

有人可以指出我如何在 C++ 中读取默认的 Windows 网关 IP 地址。我可以使用 GetAdaptersInfo() 读取所有 IP 地址的列表,但不能读取默认网关 IP 地址。

   GetAdaptersInfo( pAdapterInfo, &BufferLength );
 // Iterate the network adapters and print their MAC address.
    while( pAdapterInfo )
    {           
        pAdapterInfo = pAdapterInfo->Next; // Get next adapter info
    }

这是代码片段,想知道哪个字段为我提供了默认网关。我可以获取列表中每个 IP 地址的网关,但我需要默认网关 IP 地址。

想要这样做的最初原因是选择具有默认网关的 IP 的特定 MAC 地址(从一堆 MAC 地址中)。当我们在遍历列表时获得多个 MAC 地址时,我们认为最好的方法是选择具有默认网关的 IP 的 MAC 地址。此后我们改变了主意,将选择有线连接 MAC 地址。但我仍然很想知道如何获取默认网关而不是遍历所有适配器。

4

4 回答 4

3

GetAdaptersInfo给你这个:

网关列表

类型:IP_ADDR_STRING

此适配器的网关 IPv4 地址表示为 IP_ADDR_STRING 结构的链接列表。一个适配器可以有多个分配给它的 IPv4 网关地址。此列表通常包含此适配器默认网关的IPv4 地址的单个条目。

GetAdaptersInfo如果您无法从已有的数据中获取网关,也许您需要发布您的代码。

ipconfig /all基本上,您可以通过在推荐提示符下运行来“预览”这些信息。您将看到每个接口都定义了网关,没有全局网关。route print为您获取路由,您可以看到它们被优先考虑,这规定了这个或那个网关是否被有效使用:这取决于采用哪条路由。

于 2013-02-27T19:56:47.833 回答
1

由于您想使用 WINAPI,GetAdapterAddresses可能只是最好的选择。

GAA_FLAG_INCLUDE_GATEWAYS | GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_MULTICAST

IP_ADAPTER_ADDRESSES 函数的文档在这里

于 2014-06-24T17:42:30.603 回答
0

它根本无法以这种方式工作 - 设置窗口显示给定接口的默认网关,但没有整个系统的默认网关之类的东西。再次设置窗口将尝试提供帮助并建议将一个或另一个网络接口设置为默认值,但如果您这样做,真正发生的情况是在路由表中添加一个默认条目。问题是更高级的设置将使您能够根据目标地址使用不同的接口(甚至网关)。如果您希望您的默认网关用于通信某些特定地址,您可以使用GetBestRoute- 它会告诉你如果你想联系给定的地址,你会使用哪个网关。如果您只想为您的计算机获取一个通用的默认网关,您可能会尝试扫描路由表,但这是一件令人讨厌的事情,而且那里甚至可能没有被识别为单个默认网关的东西,可能有很多——无论如何,系统通常都会“正常工作”,但让你的程序发现它可能会变得很棘手。

总结一下:没有计算机范围的默认网关。桌面 Windows 通常以类似的方式设置,但这不是严格的要求。即使是这样,它也是使用较低级别的机制(路由表)完成的,并且读取它的配置可能会令人讨厌 - 我知道,我已经做到了;)

另一个想法 - 控制面板可能会将这些设置保存在注册表中的某个位置,以便系统能够在每次系统启动时配置网络。如果您发现这些在哪里,您可能无法获得 100% 面向网络的默认网关,但您肯定会获得用户在设置窗口中看到的值。我不知道在哪里可以找到这样的知识,我怀疑它没有发布,并作为实现细节保留 - 意味着它可以从一个版本到另一个版本,甚至有一些更大的更新/服务包。如果您采用这种方式,它很可能无法在不同的 Windows 版本之间移植。

PS 为什么需要这个?为什么会有人需要这个?

于 2014-06-25T06:18:19.237 回答
0

通常,您将使用 GetAdaptersInfo(根据 Roman R 的答案)或最好使用 GetAdapterAddresses(根据 specializt 的答案)来列出适配器,并且恰好一个适配器将配置一个网关。但是,可以有多个默认网关,但不建议这样做。但是,在有多个默认网关的计算机上,我相信GetBestRoute功能会告诉您当前正在使用哪一个。请注意,这可能随时更改。

只有当多个适配器配置了网关时,您才需要调用 GetBestRoute 来决定哪个默认网关最有可能用于任何给定的连接。请记住,如果有多个默认网关,则它们都不会被认为天生比其他网关“更好”;换句话说,在这种情况下,没有“默认网关”之类的东西,只有“默认网关”。

于 2013-02-27T23:05:04.810 回答