【问题标题】:How to determine the default network adapter through WinApi?如何通过 WinApi 确定默认网络适配器?
【发布时间】:2016-03-08 23:11:35
【问题描述】:

有没有办法通过 Windows API 来确定哪个是主要/默认网络适配器?

例如,如果我的 PC 有两个网卡,我需要知道系统使用哪一个来访问互联网,如果我有一个网络适配器和一个虚拟适配器。

我尝试使用GetAdaptersAddresses,但它没有显示哪个是最喜欢的,也许是GetBestInterface

【问题讨论】:

    标签: winapi network-programming adapter default


    【解决方案1】:

    使用GetAdaptersInfo 并寻找满足您要求的IP 范围怎么样?

    或者,遇到了这个(WMI):

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa394216(v=vs.85).aspx

    ~截图:

    完成此操作后,您可能会将列表减少到一个 或两个已配置的适配器。

    您还可以使用以下过程来查找默认适配器:

    1. 运行以下查询:“SELECT InterfaceIndex, Destination FROM Win32_IP4RouteTable WHERE Destination='0.0.0.0'” 你应该只有 一个默认网络目标 0.0.0.0。
    2. 使用 InterfaceIndex 检索所需的网络适配器。 "SELECT * FROM Win32_NetworkAdapter WHERE InterfaceIndex=" + 在此处插入变量

    这是一篇声称确定默认值的 CodeProject 文章:

    http://www.codeproject.com/Articles/13421/Getting-the-Physical-MAC-address-of-a-Network-Inte

    获取网络接口卡的物理 (MAC) 地址并确定它是否是多宿主系统上的主适配器

    找出具有给定索引的适配器是否是主适配器 为了找出具有给定索引的适配器是否是 主适配器,我必须在对话框类中添加一个函数 CNetCfgDlg.此代码遍历 m_pAdapters 数组,比较 给定的适配器索引和数组中每个适配器的索引。 如果给定的适配器索引等于所有的最小索引 数组中的适配器,则它是主适配器

    还有一件事要考虑,每个适配器都有“自动指标”设置,似乎选择最低设置作为首选(尽管不确定如何以编程方式访问此指标设置):

    http://www.softminer.net/2011/09/setting-default-network-adapter-in.html

    【讨论】:

    • GetAdaptersInfo 只是 GetAdaptersAddresses 的 IPv4 版本,我已经用它来检索适配器信息,但我不知道(而且似乎没有关于它的信息)哪个参数使该适配器成为默认值一个!
    • @j0kky 看看这篇文章:msdn.microsoft.com/en-us/library/windows/desktop/… - 我将编辑我的答案以添加它。
    • 它与 WMI 类相关,但它提供与 GetAdaptersAddresses 类似的信息,但对我没有帮助:(
    • 我遇到了“自动度量”设置,它似乎是用来选择一个首选的;但还没有找到任何以编程方式访问该值的方法。 softminer.net/2011/09/setting-default-network-adapter-in.html
    • 谢谢! - CodeProject 上的文章做了一个错误的假设:“如果给定的适配器索引等于数组中所有适配器的最小索引,那么它就是主适配器”,这根本不是真的,索引是完全随机的。 - 您通过 WMI 的解决方案使用路由度量!我不喜欢 WMI,所以我搜索了一个替代方案,并尝试了 GetIpForwardTable,它完全符合我的搜索要求:MIB_IPFORWARDTABLE 结构应该包含所需的所有信息 :)
    【解决方案2】:

    SO Answer 解释了如何确定用于连接 Internet 的本地 IP 地址(如 Google 的 DNS 服务器),然后您可以将此本地 IP 地址与 GetAdaptersAddresses 返回的列表进行比较,以确定哪个网卡用于 Internet 访问。

    【讨论】:

    • 您的解决方案是最简单的解决方案,但您必须连接到(因此,您必须依赖)外部服务器才能成功执行 getsockname() 并检索您的本地 IP。
    • 是的,但我找不到任何其他程序-如果有更好的方法,我希望其他人发表评论...
    • 这只是一个假设,但我认为WinSock connect() 使用GetBestInterface 或GetBestRoute 来测试哪个本地IP 绑定到...
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多