using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading.Tasks; namespace IPMonitor { public class NetworkStatus { private NetworkStatus() { } /// /// Indicates whether any network connection is available /// Filter connections below a specified speed, as well as virtual network cards. /// /// /// true if a network connection is available; otherwise, false. /// public static bool IsNetworkAvailable() { return IsNetworkAvailable(0); } public static bool IsInternetConnected() { try { Ping myPing = new Ping(); String host = "google.com"; byte[] buffer = new byte[32]; int timeout = 1000; PingOptions pingOptions = new PingOptions(); PingReply reply = myPing.Send(host, timeout, buffer, pingOptions); if (reply.Status == IPStatus.Success) { return true; } else if (reply.Status == IPStatus.TimedOut) { return true; } else { return false; } } catch (Exception) { return false; } } /// /// Indicates whether any network connection is available. /// Filter connections below a specified speed, as well as virtual network cards. /// /// The minimum speed required. Passing 0 will not filter connection using speed. /// /// true if a network connection is available; otherwise, false. /// public static bool IsNetworkAvailable(long minimumSpeed) { if (!NetworkInterface.GetIsNetworkAvailable()) return false; foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { // discard because of standard reasons if ((ni.OperationalStatus != OperationalStatus.Up) || (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) || (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel)) continue; // this allow to filter modems, serial, etc. // I use 10000000 as a minimum speed for most cases if (ni.Speed < minimumSpeed) continue; // discard virtual cards (virtual box, virtual pc, etc.) if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) || (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)) continue; // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card. if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase)) continue; return true; } return false; } } }