Есть ли способ указать, какой NetworkInterface .net будет использовать?

Я хотел бы провести серию тестов на устройстве, использующем его Wi-Fi и LAN-соединения. У меня две сетевые карты, одна WiFi, другая проводная. Устройство имеет один IP-адрес, доступный через оба сетевых интерфейса. Есть ли способ гарантировать, что моя машина использует определенный сетевой интерфейс, чтобы я мог запускать все тесты через проводное соединение, а затем запускать все тесты через соединение Wi-Fi?

Имейте в виду, что оба подключения используют одну и ту же подсеть, поэтому любое из них будет успешно подключено к устройству. Я просто хочу иметь возможность переключаться вперед и назад и указывать, какое соединение я использую в любой момент времени.

Я использую HttpClient в .net с C #. Есть ли способ заставить HttpClient использовать определенный сетевой интерфейс? Кажется, что он автоматически выбирает один на основе IP-адреса, но в этом случае могут работать 2 сетевых интерфейса. Мне нужно иметь возможность программно переключаться взад и вперед, чтобы запускать автоматические тесты.

Я заметил нечто, называемое «метрикой интерфейса», которую можно изменить вручную с помощью дополнительных настроек TCP / IP свойств IP4. Будет ли каждый раз использоваться интерфейс с меньшим номером? Есть ли способ изменить это значение программно?

БОЛЬШЕ УТОЧНЕНИЯ: причина, по которой я не перескочил напрямую к отключению сетевой карты Wi-Fi или проводной сетевой карты взад и вперед, заключалась в том, что когда вы отключаете сетевую карту Wi-Fi, вы отключаете устройство, к которому оно было подключено, и оно не подключается автоматически, когда вы его включаете . (даже когда вы говорите «подключиться автоматически», он не подключается при повторном включении). Однако я нашел быстрое решение. Установите метрику интерфейса на проводной сетевой карте ниже, чем метрика интерфейса на сетевой карте Wi-Fi. Затем просто включите и отключите проводную сетевую карту. Если этот параметр отключен, система будет использовать сетевая карта WiFi. Если этот параметр включен, проводная сетевая карта будет использоваться системой, поскольку ее метрика интерфейса установлена ​​ниже. Теперь мне просто нужно выяснить, как программно включать / отключать проводную сетевую карту ...


person Curtis    schedule 30.03.2018    source источник
comment
Мне любопытно, почему у вас это так настроено? Просто отключите беспроводную связь при проверке проводной и наоборот. На самом деле, хотя я не уверен, почему у вас будет один IP-адрес для двух сетевых интерфейсов, если у вас не установлен какой-то мостовой адаптер, в этот момент он должен быть прозрачным для клиентских приложений относительно того, какой из них используется. ..   -  person Ron Beyer    schedule 30.03.2018
comment
Это для автоматизированного теста. Мне нужно, чтобы он запускал оба варианта теста без вмешательства пользователя. Я хочу, чтобы он работал сам по себе в течение нескольких дней, переключаясь между адаптерами без потери соединения. Это ненормальное использование, просто тест проверит оба соединения.   -  person Curtis    schedule 30.03.2018
comment
stackoverflow .com / questions / 172875 /.   -  person Ron Beyer    schedule 30.03.2018
comment
Для ясности: вы спрашиваете, как заставить исходящий трафик использовать либо NIC1, либо NIC2 - вы не говорите о входящем трафике?   -  person RB.    schedule 30.03.2018
comment
Просто исходящий трафик, меня не волнует входящий трафик   -  person Curtis    schedule 30.03.2018


Ответы (4)


Один из способов - обновить таблицу маршрутов, чтобы направить трафик для определенного IP-адреса на конкретную сетевую карту. Таблица маршрутов - это то, что используется, чтобы решить, на какой сетевой адаптер отправлять трафик.

Сделать это можно двумя способами:

1) Используйте P / Invoke, чтобы обновить таблицу маршрутов кодом C # (см. здесь хороший пример, но в основном вы вызываете CreateIpForwardEntry).

2) Используйте Process.Start для вызова route.exe, например

route.exe ADD destination_network MASK subnet_mask  gateway_ip metric_cost

и

route.exe CHANGE destination_network MASK subnet_mask  gateway_ip metric_cost
person RB.    schedule 30.03.2018

Можно использовать библиотеку WlanAPI.cs

static public void Connect_to_wifi(string ssid)
            {
                WlanClient client = new WlanClient();
                foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
                {
                    // Lists all networks with WEP security
                    //Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
                    //foreach (Wlan.WlanAvailableNetwork network in networks)
                    //{
                    //    if (network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP)
                    //    {
                    //        Console.WriteLine("Found WEP network with SSID {0}.", network.profileName);
                    //    }
                    //}
    
                    // Retrieves XML configurations of existing profiles.
                    // This can assist you in constructing your own XML configuration
                    // (that is, it will give you an example to follow).
                    foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles())
                    {
                        if (profileInfo.profileName == ssid)
                        {
                            wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, wlanIface.GetProfileXml(profileInfo.profileName), true);
                            wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileInfo.profileName);
                            break;
                        }
                    }
                }
            }
person Pau Dominguez    schedule 23.03.2021


В итоге я решил эту проблему, установив метрику интерфейса на проводной сетевой карте ниже, чем метрика интерфейса на сетевой карте Wi-Fi. Таким образом, я смог просто отключить и включить проводную сетевую карту, которая эффективно изменяла бы используемую сетевую карту в любое время во время теста. Чтобы отключить сетевую карту, я использую команду netsh.exe со следующим кодом. «Команда» была либо «включить», либо «отключить» в зависимости от того, включаю я ее или выключаю:

        System.Diagnostics.Process p = new System.Diagnostics.Process
        {
            StartInfo =
            {
                FileName = "netsh.exe",
                Arguments = $"interface set interface \"{nicName}\" {command}",
                UseShellExecute = false,
                RedirectStandardOutput = true
            }
        };

        bool started = p.Start();
person Curtis    schedule 02.04.2018