Подтвердить что ты не робот

Как определить, управляет ли Windows трафиком по локальной сети или через Wi-Fi в С#

Я пишу часть программного обеспечения на С#, используя .NET 2, которая определяет, существует ли на компьютере Windows активное соединение ethernet.

Важно, что он знает, что это ethernet, а не WiFi, поскольку программа будет вести себя по-разному в зависимости от того, идет ли передача данных с WebClient через Wi-Fi или Ethernet.

Я попытался использовать System.Net.NetworkInformation.NetworkInterfaceType, но это, кажется, сообщает "Ethernet" для большого количества карт WiFi.

Любые предложения будут высоко оценены.

4b9b3361

Ответ 1

В соответствии с этой страницей MSDN о свойстве NetworkInterface.NetworkInterfaceType,

Это свойство возвращает только подмножество возможные значения, определенные в Перечисление NetworkInterfaceType. возможные значения включают следующее:

Ethernet Fddi Loopback Ppp Slip TokenRing Unknown

Таким детерминистически вы можете быть SOL.

Однако вы можете выполнить некоторые эвристики в доступных сетевых подключениях, чтобы определить, являются ли они WiFi или кабелем. Они могут включать в себя время отклика/времени ответа ping, принятое во многих итерациях, и т.д.

Кроме того, скорость адаптера может использоваться как подсказка. Для моего адаптера WiFi скорость всегда отображается как "54000000" (например, 54 мб). Поскольку существует набор общих скоростей WiFi, это может быть полезно.

Возможно, вы можете запустить следующий код:

using System;
using System.Net.NetworkInformation;
using System.Net;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
            Ping pingObj = new Ping();

            for (int i = 0; i < adapters.Length; i++)
            {
                Console.WriteLine("Network adapter: {0}", adapters[i].Name);
                Console.WriteLine("    Status:            {0}", adapters[i].OperationalStatus.ToString());
                Console.WriteLine("    Interface:         {0}", adapters[i].NetworkInterfaceType.ToString());
                Console.WriteLine("    Description:       {0}", adapters[i].Description);
                Console.WriteLine("    ID:                {0}", adapters[i].Id);
                Console.WriteLine("    Speed:             {0}", adapters[i].Speed);
                Console.WriteLine("    SupportsMulticast: {0}", adapters[i].SupportsMulticast);
                Console.WriteLine("    IsReceiveOnly:     {0}", adapters[i].IsReceiveOnly);
                Console.WriteLine("    MAC:               {0}", adapters[i].GetPhysicalAddress().ToString());
                if (adapters[i].NetworkInterfaceType != NetworkInterfaceType.Loopback)
                {
                    IPInterfaceProperties IPIP = adapters[i].GetIPProperties();
                    if (IPIP != null)
                    {
                        // First ensure that a gateway is reachable:
                        bool bGateWayReachable = false;
                        foreach (GatewayIPAddressInformation gw in IPIP.GatewayAddresses)
                        {
                            Console.WriteLine("    Gateway:     {0} - ", gw.Address.ToString());

                            // TODO: Do this many times to establish an average:
                            PingReply pr = pingObj.Send(gw.Address, 2000);

                            if (pr.Status == IPStatus.Success)
                            {
                                Console.WriteLine("    reachable ({0}ms)", pr.RoundtripTime);
                                bGateWayReachable = true;
                                break;
                            }
                            else
                                Console.WriteLine("    NOT reachable");
                        }
                        // Next, see if any DNS server is available. These are most likely to be off-site and more highly available.
                        if (bGateWayReachable == true)
                        {
                            foreach (IPAddress ipDNS in IPIP.DnsAddresses)
                            {
                                Console.WriteLine("    DNS:         {0} - ", ipDNS.ToString());
                                PingReply pr = pingObj.Send(ipDNS, 5000); // was 2000, increased for Cor in UK office
                                if (pr.Status == IPStatus.Success)
                                {
                                    Console.WriteLine("    reachable ({0}ms)", pr.RoundtripTime);
                                    Console.WriteLine("    --- SUCCESS ---");
                                    break;
                                }
                                else
                                    Console.WriteLine("    NOT reachable");
                            }
                        }
                    } // if (IPIP != null)
                }
            } // foreach (NetworkInterface n in adapters)

            Console.ReadLine();
        }
    }
}