Как определить, направляет ли Windows трафик через локальную сеть или через WiFi в C # - PullRequest
12 голосов
/ 18 мая 2010

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

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

Я пытался использовать System.Net.NetworkInformation.NetworkInterfaceType, но, по-видимому, сообщается «Ethernet» для многих карт WiFi.

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

1 Ответ

5 голосов
/ 18 мая 2010

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

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

Ethernet Fddi Loopback Ppp Slip TokenRing Неизвестный

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

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

Кроме того, скорость адаптера может быть использована в качестве подсказки. Для моего адаптера 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...