Как обнаружить, если Windows направляет трафик по LAN или по WiFi в C#

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

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

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

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

12
задан IAmFledge 18 May 2010 в 16:31
поделиться

1 ответ

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

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

Ethernet Fddi Loopback Ppp Slip TokenRing Unknown

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

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

Также в качестве подсказки может быть использована скорость адаптера. Для моего WiFi адаптера скорость всегда отображается как "54000000" (например, 54 mbs). Поскольку существует набор общих скоростей 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();
        }
    }
}
5
ответ дан 2 December 2019 в 23:31
поделиться