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

Posted

技术标签:

【中文标题】如何在 C# 中检测 Windows 是通过 LAN 还是通过 WiFi 引导流量【英文标题】:How to detect if Windows is directing traffic over LAN or over WiFi in C# 【发布时间】:2011-02-20 23:57:11 【问题描述】:

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

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

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

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

根据这个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 (0ms)", 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 (0ms)", pr.RoundtripTime);
                                    Console.WriteLine("    --- SUCCESS ---");
                                    break;
                                
                                else
                                    Console.WriteLine("    NOT reachable");
                            
                        
                     // if (IPIP != null)
                
             // foreach (NetworkInterface n in adapters)

            Console.ReadLine();
        
    

【讨论】:

以上是关于如何在 C# 中检测 Windows 是通过 LAN 还是通过 WiFi 引导流量的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过本机 C# 调用检测系统上安装了哪些 Windows 应用商店应用程序?

如何检测windows窗体中的控件并对其进行编辑c#

如何在 C# .NET 中检测应用程序池重新启动?

使用 C# 在 Windows 上检测防病毒软件 [关闭]

如何在windows中检测控件是不是是输入控件并覆盖输入

如何检测用户是不是在 c# 中摇晃(检测摇晃),