简体   繁体   中英

C# Local IP is not correct with multiple Ethernet

I need to get the Local IP address of PC but if pc is connected to multiple network the ip is not correct.

I'm using:

public static string GetIPAddress()
        {
            IPHostEntry host;
            string localIP = "?";
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    localIP = ip.ToString();
                }
            }
            return localIP;
        }

Like:

在此处输入图片说明

I need get the local ip of adapter with internet or all local ip address.

I can see 2 options:

option 1

loop trough all interfaces using System.Net.NetworkInformation :

static List<IPAddress> GetIpAddress()
{
    List<IPAddress> AllIps = new List<IPAddress>();

    foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces())
    {

        IPInterfaceProperties properties = netif.GetIPProperties();

        foreach (IPAddressInformation unicast in properties.UnicastAddresses)
        {
            AllIps.Add(unicast.Address);
            Console.WriteLine(unicast.Address);
        }
    }

    return AllIps;
}

option 2

find the default gateway to the internet, then match the default gateway address to the interface addresses you found:

 public static IPAddress GetDefaultGateway()
 {
     IPAddress result = null;
     var cards = NetworkInterface.GetAllNetworkInterfaces().ToList();
     if (cards.Any())
     {
         foreach (var card in cards)
         {
             var props = card.GetIPProperties();
             if (props == null)
                 continue;

             var gateways = props.GatewayAddresses;
             if (!gateways.Any())
                 continue;

             var gateway =
                 gateways.FirstOrDefault(g => g.Address.AddressFamily.ToString() == "InterNetwork");
             if (gateway == null)
                 continue;

             result = gateway.Address;
             break;
         };
     }

     return result;
 }

now you can combine the 2 options in order to find the interface that is connected to the internet. here is my suggestion to match the default gateway to the correct adapter address.
you can also determine the IP address classes using the IpClass Enumeration that is written in the code i have added:

static void Main(string[] args)
{
    // find all interfaces ip adressess
    var allAdaptersIp = GetIpAddress();
    // find the default gateway
    var dg = GetDefaultGateway();
    // match the default gateway to the host address => the interface that is connected to the internet => that print host address
    Console.WriteLine("ip address that will route you to the world: " + GetInterNetworkHostIp(ref allAdaptersIp, dg, IpClass.ClassC));
    Console.ReadLine();
}

enum IpClass
{
    ClassA,
    ClassB,
    ClassC
}

static string GetInterNetworkHostIp(ref List<IPAddress> adapters, IPAddress dg, IpClass ipclassenum)
{
    string networkAddress = "";
    var result = "" ;

    switch (ipclassenum)
    {
        case IpClass.ClassA:
            networkAddress  = dg.ToString().Substring(0, dg.ToString().Length - dg.ToString().LastIndexOf(".") ); 
            break;
        case IpClass.ClassB:
            networkAddress = dg.ToString().Substring(0, dg.ToString().Length - dg.ToString().IndexOf(".",3));
            break;
        case IpClass.ClassC:
            networkAddress = dg.ToString().Substring(0, dg.ToString().Length- dg.ToString().IndexOf(".") );
            break;
        default:

            break;
    }

    foreach (IPAddress ip in adapters)
    {
        if (ip.ToString().Contains(networkAddress))
        {
            result = ip.ToString();
            break;
        }
    }

    if (result == "")
        result = "no ip was found";

    return result;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM