有些人可以指出如何在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地址。但我仍然很想知道如何获取默认网关而不是通过所有适配器进行迭代。
答案 0 :(得分:3)
GetAdaptersInfo
为您提供:
GatewayList
输入:IP_ADDR_STRING
此适配器的网关的IPv4地址表示为IP_ADDR_STRING结构的链接列表。适配器可以有多个 分配给它的IPv4网关地址。此列表通常包含一个 单个条目,用于此适配器的默认网关的IPv4地址。
如果您无法从已有的GetAdaptersInfo
数据中获取网关,则可能需要发布代码。
基本上,您可以通过在推荐提示符下运行ipconfig /all
来“预览”此信息。您将看到每个接口定义的网关,没有全局网关。 route print
获取路由,您可以看到它们的优先级,并且规定了这个或那个网关是否被有效使用:它取决于采用的路由。
答案 1 :(得分:1)
由于您想使用WINAPI,GetAdapterAddresses可能只是最佳选择。
GAA_FLAG_INCLUDE_GATEWAYS | GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_MULTICAST
IP_ADAPTER_ADDRESSES函数的文档是here。
答案 2 :(得分:0)
通常,您可以使用GetAdaptersInfo(根据Roman R的答案)或者最好使用GetAdapterAddresses(根据specializt的答案)列出适配器,并且恰好一个适配器将只配置一个网关。但是,可以有多个默认网关,但它是not recommended。但是,在具有多个默认网关的计算机上,我相信GetBestRoute函数会告诉您当前正在使用哪个网关。请注意,这可能随时发生变化。
仅当多个适配器配置了网关时,您才需要调用GetBestRoute来决定哪个默认网关最有可能用于任何给定连接。请记住,如果有多个默认网关,则其中没有一个被认为本身比其他网关“更好”;换句话说,在这种情况下,没有“默认网关”这样的东西只有“默认网关”。
答案 3 :(得分:0)
它根本不起作用 - 设置窗口显示给定接口的默认网关,但整个系统没有默认网关。再次设置窗口将尝试提供帮助并建议将一个或另一个网络接口设置为默认设置,但如果这样做,实际发生的情况是在routing table中找到默认条目。问题是,更高级的设置将使您能够使用不同的接口(甚至网关),具体取决于目标地址。如果您希望默认网关用于通信某些特定地址,则可以使用GetBestRoute - 它会告诉您如果要联系给定地址,您将使用哪个网关。如果你想为你的计算机只获得一个通用的默认网关,你可能会尝试扫描路由表,但这是一个讨厌的事情,甚至可能没有东西可以被识别为单一的默认网关那里,可能有他们中的大多数 - 系统通常会“正常工作”,但让你的程序找到它可能会变得棘手。
要sumarize:没有这样的东西是计算机范围的默认网关。桌面Windows通常以类似于此的方式设置,但这不是严格的要求。即使它是这样,它是使用较低级别的机制(路由表)完成的,读取它的配置会变得很讨厌 - 我知道,我已经完成了它;)
另一个想法 - 控制面板可能会将这些设置保留在注册表中的某个位置,以便系统能够在每个系统启动时配置网络。如果您发现它们在哪里,您可能无法获得100%面向网络的默认网关,但您肯定会获得用户在设置窗口中看到的值。我不知道在哪里寻找这样的知识,我怀疑它没有发布,并保持为实现细节 - 指出它可以从版本更改为版本,甚至更大的更新/ Service Pack。如果你这样做,它很可能不会在不同的Windows版本之间移植。
PS你为什么需要这个?为什么有人需要这个?