如何通过WinApi确定默认网络适配器?

如何通过WinApi确定默认网络适配器?,winapi,network-programming,adapter,default,Winapi,Network Programming,Adapter,Default,是否有办法通过Windows API确定哪个是主/默认网络适配器 例如,如果我有一台带有两个网卡的PC,我需要知道系统使用哪一个网卡来访问internet,同样,如果我有一个网络适配器和一个虚拟适配器 我尝试了,但没有显示哪一个是最喜欢的,可能是?使用并寻找满足您需求的IP范围如何 或者,遇到以下问题(WMI): ~snip: 一旦你这样做了,你很可能会把你的清单减少到一个 或两个配置的适配器 您还可以使用以下过程查找默认适配器: 运行以下查询:“选择InterfaceIndex,Destin

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

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

我尝试了,但没有显示哪一个是最喜欢的,可能是?

使用并寻找满足您需求的IP范围如何

或者,遇到以下问题(WMI):

~snip:

一旦你这样做了,你很可能会把你的清单减少到一个 或两个配置的适配器

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

  • 运行以下查询:“选择InterfaceIndex,Destination FROM Win32_IP4RouteTable,其中Destination='0.0.0'”,您应该只有 一个默认网络目标0.0.0.0
  • 使用InterfaceIndex检索所需的网络适配器。“从Win32_NetworkAdapter中选择*,其中InterfaceIndex=”+ 插入变量
  • 下面是一篇CodeProject文章,声称要确定默认值:

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

    找出具有给定索引的适配器是否是主适配器 以确定具有给定索引的适配器是否为 主适配器,我必须向dialog类添加一个函数 CNetCfgDlg。此代码在m_pAdapters数组上迭代,比较 给定的适配器索引以及数组中每个适配器的索引。 如果给定的适配器索引等于所有适配器索引中的最小索引 阵列中的适配器,则它是主适配器

    还有一件事要考虑的是,每个适配器都有“自动度量”设置,它似乎选择了最低的设置作为首选(虽然不确定如何以编程方式访问此度量设置):


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

    GetAdapterInfo只是GetAdapterAddresses的IPv4版本,我已经用它来检索适配器信息,但我不知道(而且似乎没有关于它的信息)哪个参数使该适配器成为默认适配器@j0kky看看这篇文章:-我将编辑我的答案以添加它。它与WMI类相关,但它为GetAdapterAddresses提供了类似的信息,这对我没有帮助:(我遇到了“自动度量”设置,它似乎用于选择首选设置;但还没有找到任何通过编程访问该值的方法。谢谢!-关于CodeProject的文章做出了错误的假设:如果给定的适配器索引等于数组中所有适配器的最小索引,则它是主适配器“,一点也不正确,索引是完全随机的。-您通过WMI的解决方案使用路由度量!我不喜欢WMI,所以我搜索了一个替代方案并尝试了GetIpForwardTable,它完全符合我搜索的内容:MIB_IPFORWARDTABLE结构应包含所需的所有信息:)您的解决方案是最简单的,但您必须连接到(因此,您必须依赖)外部服务器才能成功执行getsockname()并检索您的本地IP。是的,但我找不到任何其他过程--我希望其他人会评论是否有更好的方法…这只是一种假设,但我认为WinSock connect()是使用GetBestInterface或GetBestRoute测试哪个本地IP绑定到。。。