Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the Default Gateway

I'm writing a program that shows the user their IP address, Subnet mask and Default gateway. I can get the first two, but for the last one, this is what I turned up:

GatewayIPAddressInformationCollection gwc =      System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses; 

That, of course, returns a collection of GatewayIPAddressInformation. So, if a computer has multiple gateways, how can I determine which is the default gateway?

In practice, I've only ever seen this collection contain a single entry, but since it's implemented as a collection, it stands to reason that some computers contain multiple gateways, none of which are marked as "Default". So is there a way to determine the default or is it all just guesswork?

like image 892
Frecklefoot Avatar asked Nov 29 '12 21:11

Frecklefoot


People also ask

How do I find my default gateway?

In the Command Prompt window, type “ipconfig” and press “Enter/Return” on your keyboard. You will see a lot of information generated in this window. If you scroll up you should see “Default Gateway” with the device's IP address listed to the right of it.

What is the default gateway IP address?

In the networking world, a default gateway is an IP address that traffic gets sent to when it's bound for a destination outside the current network. On most home and small business networks—where you have a single router and several connected devices—the router's private IP address is the default gateway.

What is the default gateway number?

A default gateway number refers to the network location that incoming traffic goes to if it isn't specifically labeled to go to a particular machine. In most cases, this location is the entry and exit point between the network itself and external traffic (which most commonly is to and from the Internet.)


1 Answers

It will probably be the first valid and enabled gateway address of the first enabled network interface:

public static IPAddress GetDefaultGateway() {     return NetworkInterface         .GetAllNetworkInterfaces()         .Where(n => n.OperationalStatus == OperationalStatus.Up)         .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback)         .SelectMany(n => n.GetIPProperties()?.GatewayAddresses)         .Select(g => g?.Address)         .Where(a => a != null)          // .Where(a => a.AddressFamily == AddressFamily.InterNetwork)          // .Where(a => Array.FindIndex(a.GetAddressBytes(), b => b != 0) >= 0)         .FirstOrDefault(); } 

I've also added some further commented checks which have been pointed out as useful by other people here. You can check the AddressFamily one to distinguish between IPv4 and IPv6. The latter one can be used to filter out 0.0.0.0 addresses.

The above solution will give you a valid/connected interface, and is good enough for 99% of situations. That said, if you have multiple valid interfaces that traffic can be routed through, and you need to be 100% accurate, the way to do this uses GetBestInterface to find an interface for routing to a specific IP address. This additionally handles the case where you might have a specific address range routed through a different adapter (e.g. 10.*.*.* going through a VPN, everything else going to your router)

[DllImport("iphlpapi.dll", CharSet = CharSet.Auto)] private static extern int GetBestInterface(UInt32 destAddr, out UInt32 bestIfIndex);  public static IPAddress GetGatewayForDestination(IPAddress destinationAddress) {     UInt32 destaddr = BitConverter.ToUInt32(destinationAddress.GetAddressBytes(), 0);      uint interfaceIndex;     int result = GetBestInterface(destaddr, out interfaceIndex);     if (result != 0)         throw new Win32Exception(result);      foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())     {         var niprops = ni.GetIPProperties();         if (niprops == null)             continue;          var gateway = niprops.GatewayAddresses?.FirstOrDefault()?.Address;         if (gateway == null)             continue;          if (ni.Supports(NetworkInterfaceComponent.IPv4))         {             var v4props = niprops.GetIPv4Properties();             if (v4props == null)                 continue;              if (v4props.Index == interfaceIndex)                 return gateway;         }          if (ni.Supports(NetworkInterfaceComponent.IPv6))         {             var v6props = niprops.GetIPv6Properties();             if (v6props == null)                 continue;              if (v6props.Index == interfaceIndex)                 return gateway;         }     }      return null; } 

These two examples could be wrapped up into a helper class and used in the appropriate cases: that you do, or do not have a destination address in mind already.

like image 165
caesay Avatar answered Sep 28 '22 16:09

caesay