5

如何在 C# 中获取连接的接口索引?

如果索引不是标准术语,我指的是与接口关联的数字,例如当您使用命令“netsh int ipv4 show int”在左侧按索引列出您的连接时。它也用于“route add [gateway] mask [index] if [interface index]”。

我知道接口的名称和描述,因此使用 NetworkInterface.GetAllNetworkInterfaces() 然后在那里找到正确的接口是相当简单的。但是从那里,我找不到索引。我认为 ID 可能相同,但它具有“{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}”形式的值,而不是小整数值。

4

4 回答 4

8

我想你想要

myInterface.GetIPProperties().GetIPv4Properties().Index;

如在

var interfaces = NetworkInterface.GetAllNetworkInterfaces(); 

foreach(var @interface in interfaces)
{
    var ipv4Properties = @interface.GetIPProperties().GetIPv4Properties();

    if (ipv4Properties != null)
        Console.WriteLine(ipv4Properties.Index);
}

请注意,如果接口没有可用的 IPv4 信息,则GetIPv4Properties()可以返回。null

msdn 页面显示了一个可能有用的示例。

于 2012-06-16T00:20:28.600 回答
1

所有网络接口都有一个 GUID,它唯一地将它们区分开来,并用于在 Win 环境中进行单独操作,这就是 ID。

idx 不直接分配给 NIC,但它被 Windows 管理系统用作用户设置详细信息的友好方式。

这里有一段代码显示如何访问可能包含信息的 ManagementObjectSearcher,您必须解析结果(而不是只选择下面的名称)

internal static IEnumerable<string> GetConnectedCardNames()
{
string query = String.Format(@"SELECT * FROM Win32_NetworkAdapter");
var searcher = new ManagementObjectSearcher
{
    Query = new ObjectQuery(query)
};

try
{
    log.Debug("Trying to select network adapters");
    var adapterObjects = searcher.Get();

    var names = (from ManagementObject o in adapterObjects
                    select o["Name"])
                        .Cast<string>();

    return names;
}
catch (Exception ex)
{
    log.Debug("Failed to get needed names, see Exception log for details");
    log.Fatal(ex);
    throw;
}
}
于 2012-06-16T00:18:26.170 回答
0

你说的是网卡绑定顺序吗?如果是这样,通常存储在此注册表项中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Linkage

于 2012-06-16T00:18:09.103 回答
0

我更新了Elian Ebbing 的答案以获取支持 IPv4 的适配器:

  IEnumerable<KeyValuePair<int, NetworkInterface>> GetNetworkInterfaces()
  {
     foreach (var networkInterface in NetworkInterface.GetAllNetworkInterfaces())
     {
        IPv4InterfaceProperties properties = null;
        try { properties = networkInterface.GetIPProperties().GetIPv4Properties(); }
        catch (NetworkInformationException) { /* this one doesn't support IPv4 */ }

        if (properties != null)
           yield return new KeyValuePair<int, NetworkInterface>(properties.Index, networkInterface);
     }
  }

PS由于涉及异常,此代码可能会很慢。NetworkChange.NetworkAddressChanged我建议从该方法返回的序列中构造一个查找,并在引发事件之前重新使用它。

于 2019-07-15T20:12:32.320 回答