2015-09-12 2 views
1

Я использую следующий код, чтобы получить адрес шлюза 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, но он не очень надежный.

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

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, я думаю. Как я могу сделать эту работу?

ответ

0

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

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

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; 
    } 
} 
Смежные вопросы