我在C#中使用.NET 2编写一个软件,它检测
Windows机器上是否有活动的以太网连接.
重要的是它知道它是以太网而不是WiFi,因为程序的行为会有所不同,这取决于是否通过WiFi或以太网发送WebClient数据.
我已经尝试使用System.Net.NetworkInformation.NetworkInterfaceType,但这似乎报告’以太网’为很多WiFi卡.
任何建议将不胜感激.
根据这个
MSDN page关于NetworkInterface.NetworkInterfaceType的属性,
This property only returns a subset of
the possible values defined in the
NetworkInterfaceType enumeration. The
possible values include the following: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(); } } }