【问题标题】:Finding the interface index in C#在 C# 中查找接口索引
【发布时间】:2012-06-16 00:07:50
【问题描述】:

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

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

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

【问题讨论】:

  • 这就是所谓的 GUID。 :)
  • Java 在他们的 NetworkInterface 类中有这个,但在 .NET 中并不容易。

标签: c# .net network-programming


【解决方案1】:

我想你想要

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 page 显示了一个可能有用的示例。

【讨论】:

  • 这只能是一半的解决方案,因为所有接口都必须有一个索引,而它不一定有一个IP地址。尤其是当 iface 关闭时...
【解决方案2】:

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

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

有一个代码 here 的 sn-p,它显示了如何访问可能包含信息的 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;
}
}

【讨论】:

    【解决方案3】:

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

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Linkage

    【讨论】:

      【解决方案4】:

      我更新了Elian Ebbing's answer 以获取支持 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);
           }
        }
      

      附:由于涉及异常,因此此代码可能会很慢。我建议从这个方法返回的序列中构造一个查找,然后重复使用它,直到引发NetworkChange.NetworkAddressChanged 事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多