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