getbestinterface (iphlpapi)
Last changed: -63.119.179.129

.
Summary
The GetBestInterface function retrieves index of the interface that has the best route to the specified IP address.

C# Signature:

[DllImport("iphlpapi.dll", SetLastError=true)]
static extern int GetBestInterface(UInt32 DestAddr, out UInt32 BestIfIndex);

VB Signature:

Declare Function GetBestInterface Lib "iphlpapi.dll" (TODO) As TODO

User-Defined Types:

None.

Notes:

DestAddr is a 32 bit representation of the four IP bytes. For .NET 1.0, you can get this from IPAddress.Address. In .NET 1.1, this is obsolete. You can use BitConverter.ToUInt32(IPAddress.GetAddressBytes()) instead.

Tips & Tricks:

Use GetAdaptersInfo to determine which adapter the index corresponds to.

Sample Code:

    public static class Win32ApiCalls
    {
    [DllImport("iphlpapi.dll", CharSet = CharSet.Auto)]
    public static extern int GetBestInterface(UInt32 destAddr, out UInt32 bestIfIndex);
    }

    class Program
    {
    static void Main(string[] args)
    {
        try
        {
        IPHostEntry hostInfo = Dns.GetHostEntry("www.yahoo.com");

        Console.WriteLine("Host name : " + hostInfo.HostName);
        Console.WriteLine("\r\nAliases : ");

        foreach (var thisAlias in hostInfo.Aliases)
        {
            Console.WriteLine(thisAlias);
        }
        Console.WriteLine("\r\nIP Address list :");
        foreach (var thisAddress in hostInfo.AddressList)
        {
            Console.WriteLine(thisAddress);
        }
        IPAddress ipv4Address = (from thisAddress in hostInfo.AddressList
                     where thisAddress.AddressFamily == AddressFamily.InterNetwork
                     select thisAddress).FirstOrDefault();
        if (ipv4Address == null)
        {
            Console.WriteLine("No Ipv4 address found for www.yahoo.com.");
            return;
        }

        Console.WriteLine("\r\nGetting best interface to reach {0}...", ipv4Address);

        UInt32 ipv4AddressAsUInt32 = BitConverter.ToUInt32(ipv4Address.GetAddressBytes(), 0);
        UInt32 interfaceindex;
        int result = Win32ApiCalls.GetBestInterface(ipv4AddressAsUInt32, out interfaceindex);
        if (result != 0)
        {
            throw new Win32Exception(result);
        }
        NetworkInterface interfaceInfo = GetNetworkInterfaceByIndex(interfaceindex);
        Console.WriteLine("Best interface:\r\n" +
                  " Index {0}\r\n" +
                  " Description: {1}\r\n" +
                  " Id: {2}", interfaceindex, interfaceInfo.Description, interfaceInfo.Id);
        }
        catch (SocketException e)
        {
        Console.WriteLine("SocketException caught!!!");
        Console.WriteLine("Source : " + e.Source);
        Console.WriteLine("Message : " + e.Message);
        }
        catch (ArgumentNullException e)
        {
        Console.WriteLine("ArgumentNullException caught!!!");
        Console.WriteLine("Source : " + e.Source);
        Console.WriteLine("Message : " + e.Message);
        }
        catch (NullReferenceException e)
        {
        Console.WriteLine("NullReferenceException caught!!!");
        Console.WriteLine("Source : " + e.Source);
        Console.WriteLine("Message : " + e.Message);
        }
        catch (Win32Exception e)
        {
        Console.WriteLine("Win32Exception caught!!!");
        Console.WriteLine("Source : " + e.Source);
        Console.WriteLine("Message : " + e.Message);
        }
        catch (Exception e)
        {
        Console.WriteLine("Exception caught!!!");
        Console.WriteLine("Source : " + e.Source);
        Console.WriteLine("Message : " + e.Message);
        }
    }

    private static NetworkInterface GetNetworkInterfaceByIndex(uint index)
    {
        // Search in all network interfaces that support IPv4.
        NetworkInterface ipv4Interface = (from thisInterface in NetworkInterface.GetAllNetworkInterfaces()
                          where thisInterface.Supports(NetworkInterfaceComponent.IPv4)
                          let ipv4Properties = thisInterface.GetIPProperties().GetIPv4Properties()
                          where ipv4Properties != null && ipv4Properties.Index == index
                          select thisInterface).SingleOrDefault();
        if (ipv4Interface != null)
        return ipv4Interface;

        // Search in all network interfaces that support IPv6.
        NetworkInterface ipv6Interface = (from thisInterface in NetworkInterface.GetAllNetworkInterfaces()
                          where thisInterface.Supports(NetworkInterfaceComponent.IPv6)
                          let ipv6Properties = thisInterface.GetIPProperties().GetIPv6Properties()
                          where ipv6Properties != null && ipv6Properties.Index == index
                          select thisInterface).SingleOrDefault();

        return ipv6Interface;
    }
    }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation