簡體   English   中英

C#本地IP與多個以太網不正確

[英]C# Local IP is not correct with multiple Ethernet

我需要獲取PC的本地IP地址,但是如果PC連接到多個網絡,則IP不正確。

我正在使用:

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;
        }

喜歡:

在此處輸入圖片說明

我需要使用互聯網或所有本地IP地址獲取適配器的本地IP。

我可以看到2個選項:

選項1

使用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;
}

選項2

查找到Internet的默認網關,然后將默認網關地址與找到的接口地址匹配:

 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;
 }

現在,您可以組合兩個選項以找到連接到互聯網的接口。 這是我的建議,將默認網關與正確的適配器地址匹配。
您還可以使用在我添加的代碼中編寫的IpClass枚舉確定IP地址類別

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM