Tutorial :How can I tell if a network cable has been unplugged?


I have a C# application that should only be used when the network is down, but am afraid users will just unplug the network cable in order to use it.

Is there a way to detect if the network cable has been unplugged?



You could use IsNetworkAlive(). Although technically it doesn't check link state, it's probably better since it can detect wireless and dialup connectivity as well. Here's an example:

using System.Runtime.InteropServices;  class Program  {      [DllImport("sensapi.dll")]      static extern bool IsNetworkAlive(out int flags);        static void Main(string[] args)      {          int flags;          bool connected = IsNetworkAlive(out flags);        }  }  

The flags param returns whether the connection is to the internet or just a LAN. I'm not 100% sure how it knows, but I'd bet it just looks to see if there is a default gateway set.


In my humble opinion, there is no certain way to distinguish between a network down and an unplugged cable. And even if there is a way, there is also a way to work around it.

Let's assume that you have a solution and let's look at some situations:

  • There is no network traffic, the cable is not unplugged from the computer: it may be unplugged at the other end.
  • There is no network traffic, the cable is unplugged: but this has always been the case, the laptop is connected via Wi-Fi, which is down at the moment.
  • There are several network interfaces, only the one connected to WAN is down: should your app work?
  • The network is actually down, in the sense you mean: someone has managed to reboot the router continuously for using your app.


You can use this



Some network drivers are able to detect this. However you'd need to use unmanaged code to access them from C# (which may be very difficult/impossible) and the solution may not be reliable for all network adapters.


The network card will report this as a state. Tools like ethtool can display this (Link up), but that is only available for Linux/Unix.

If you can enumerate the installed network cards with a Windows API, I'm sure you'll find the flag for "link up" somewhere in there.


You could register a delegate to the NetworkChange Class. When a network change occurs, it doesn't actually notify you what happened, so you could list all the network interfaces (Using NetworkInterface), filter the ones that concern you (By checking there properties) and check their operational status.


If I really wanted to use your application and whether it will work depends on something like this, I would always be able to find a way to trick your application. Are you sure there's no better solution?


How about pinging the default gateway?

There is some code here that gets the default gateway from the registry.


To detect 'Is network cable plugged in a machine?', below piece of code works.

class Program  {      private static void Main(string[] args)      {          bool isNetworkCableConnected = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();      }   }  

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »