1. 程式人生 > 其它 >C# 如何獲取本機IP

C# 如何獲取本機IP

本文將介紹如何正確的使用C#獲取本機當前正在使用的IP地址。

百度搜索的方案

如果你去百度C#如何獲取本機IP,那麼大概率的你會得到以下的幾段程式碼,第一種就是這樣:

string name = Dns.GetHostName(); 
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);

或者這樣:

        public static void GetLoacalIPMaybeVirtualNetwork()
        {
            var host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (var ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    Console.WriteLine(ip.ToString());
                }
            }
        }

這種寫法本身沒有問題,但是當你的電腦上有多個網絡卡,比如vmare虛擬的的網絡卡,那麼你會得到一列的IP資料,沒有辦法得到這些IP那個是你正在使用的IP。

就像這樣

這時網上的程式碼就會給你第二種的參考程式碼即讓你去訪問一個網站獲取或者使用ipconfig命令來獲取IP。

這種方式沒有什麼問題,但是如果使用訪問網站的方式,那麼你可能獲取到的是運營商分配的IP而不是本機區域網的IP。在一些需要訪問本機區域網的的應用下就不太適用。

所以我個人認為這些方案都不是特別好。

我的方案

C#在其System.Net.NetworkInformation包下有一個NetworkInterfaceType

的列舉類,在這個列舉類下定義了多種的網路型別。
比如網路介面使用乙太網連線。乙太網是在IEEE中定義的 802.3型別的Ethernet,再比如網路介面使用無線LAN連線(IEEE 802.11標準)的型別Wireless80211

通過這個列舉類,我們就能判斷該網路IP所屬的型別。

然後我們就可以通過使用抽象類NetworkInterface提供的GetAllNetworkInterfaces獲取所有的網路介面,之後再通過判斷NetworkInterfaceType網路介面型別,來獲取正在使用真正的區域網IP。

具體程式碼如下:

        public static string GetLocalIPv4(NetworkInterfaceType _type)
        {
            string output = "";
            foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
            {
                // 網路型別是所規定的並且網路再執行狀態
                if (item.NetworkInterfaceType == _type && item.OperationalStatus == OperationalStatus.Up)
                {
                    foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
                    {
                        if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                        {
                            output = ip.Address.ToString();
                        }
                    }
                }
            }
            return output;
        }

這時,我們就可以根據網路型別來獲取相應的IP,鑑於當前大多數人使用的都是無線網絡卡,那麼我們就可以先從無線網絡卡來獲取IP地址。

        public static string IPV4()
        {
            string ipv4 = GetLocalIPv4(NetworkInterfaceType.Wireless80211);
            // 如果不是無線網絡卡,則獲取有線網絡卡的地址
            if (ipv4 == "")
            {
                ipv4 = GetLocalIPv4(NetworkInterfaceType.Ethernet);
                // 如果有線網絡卡也沒有獲取到資料,則使用最開始可能包含虛擬網絡卡的方法來獲取IP
                if (ipv4 == "")
                {
                    ipv4 = GetLoacalIPMaybeVirtualNetwork();
                }
             }
            return ipv4;
        }

這樣我們就能獲取到本機目前使用的區域網IP了。

另外,推薦在使用獲取IP的方法之前,先使用NetworkInterface.GetIsNetworkAvailable()方法來判斷一下網路是否連線,確保後期獲取IP不會出錯。

END

版權資訊:本文首發於https://www.buguagaoshu.com 轉載請註明來源