Определить, какой сетевой интерфейс используется

Я использую следующий код, чтобы получить адрес шлюза IPv4 локального компьютера.

var interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
var wifi = interfaces[3];
var gatewayAddresses = wifi.GetIPProperties().GatewayAddresses;
var gateway = gatewayAddresses[0].Address.ToString();
IPv4GatewayValueLabel.Text = gateway;

который работает нормально, но я выбираю интерфейс (тот, который активен) вручную. Я хочу выбрать его программно.

Я сделал некоторую отладку. NetworkInterface.GetAllNetworkInterfaces() возвращает список интерфейсов. В моем случае их 7. Я искал свойство, которое отличает активный интерфейс от остальных, и нашел OperationalStatus, но это не совсем надежно.

Я подключен к Интернету с помощью своего мобильного телефона (точка доступа Wi-Fi), и это список интерфейсов, который я получаю:

0:
    Description         "Microsoft Wi-Fi Direct Virtual Adapter"
    OperationalStatus   Down
1:
    Description         "Bluetooth Device (PAN)"
    OperationalStatus   Down
2:
    Description         "Realtek PCIe FE Family Controller"
    OperationalStatus   Down
3:
    Description         "Dell Wireless 1701 802.11b/g/n"
    OperationalStatus   Up
4:
    Description         "Software Loopback Interface 1"
    OperationalStatus   Up
5:
    Description         "Microsoft ISATAP Adapter"
    OperationalStatus   Down
6:
    Description         "Teredo Tunneling Pseudo-Interface"
    OperationalStatus   Down

Как видите, есть два интерфейса со значением Up. Кроме того, я не был уверен, что этот список исправлен, поэтому в этот раз я подключился с помощью USB-модема, и список интерфейсов немного изменился:

0:
    Description         "SAMSUNG Mobile USB Remote NDIS Network Device"
    OperationalStatus   Up
1:
    Description         "Microsoft Wi-Fi Direct Virtual Adapter"
    OperationalStatus   Down
2:
    Description         "Bluetooth Device (PAN)"
    OperationalStatus   Down
3:
    Description         "Realtek PCIe FE Family Controller"
    OperationalStatus   Down
4:
    Description         "Dell Wireless 1701 802.11b/g/n"
    OperationalStatus   Down
5:
    Description         "Software Loopback Interface 1"
    OperationalStatus   Up
6:
    Description         "Teredo Tunneling Pseudo-Interface"
    OperationalStatus   Up
7:
    Description         "Microsoft ISATAP Adapter #2"
    OperationalStatus   Down

Следовательно, я не могу полагаться на OperationalStatus, я думаю. Как я могу заставить это работать?


person akinuri    schedule 12.09.2015    source источник


Ответы (2)


Вы находитесь на правильном пути и, вероятно, уже поняли это, но это то, что я использую, и пока это работает. Единственная проблема, о которой я мог подумать, это если кто-то использовал другое программное обеспечение vm, отличное от Hyper-V, поскольку я специально ищу это.

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface nic in nics)
{
  if (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback 
      && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel
      && nic.OperationalStatus == OperationalStatus.Up 
      && nic.Name.StartsWith("vEthernet") == false 
      && nic.Description.Contains("Hyper-v") == false)
  {
    //Do something
    break;
  }
}
person Casey Estes    schedule 09.11.2016

возможно, в физической системе (не могу комментировать виртуальный клиент) вы также можете проверить NetworkInterfaceType (NetworkInterfaceType.Wireless80211 и NetworkInterfaceType.Ethernet) вместе с OperationalStatus, чтобы проверить, какой из них является реальным физическим аппаратным адаптером.

Однако я никогда не пробовал конфигурацию, в которой включено радио Wi-Fi, а система также подключена к кабелю Ethernet.

person Kapoor    schedule 12.09.2015