如何检测Windows是通过LAN引导流量还是通过WiFi引导流量#

时间:2010-05-18 16:31:44

标签: c# .net windows networking

我正在使用.NET 2在C#中编写一个软件,它检测Windows机器上是否存在活动的以太网连接。

重要的是它知道它是以太网而不是WiFi,因为程序的行为会有所不同,具体取决于使用WebClient发送数据是通过WiFi还是以太网。

我尝试过使用System.Net.NetworkInformation.NetworkInterfaceType,但这似乎报告了许多WiFi卡的“以太网”。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:5)

根据此MSDN page关于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();
        }
    }
}