C#獲得本地IP地址的各種方法
阿新 • • 發佈:2020-12-14
網上有很多種方法可以獲取到本地的IP地址。一線常用的有這麼些:
列舉本地網絡卡
using System.Net.NetworkInformation; using System.Net.Sockets; foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces() .Where(a => a.SupportsMulticast) .Where(a => a.OperationalStatus == OperationalStatus.Up) .Where(a => a.NetworkInterfaceType != NetworkInterfaceType.Loopback) .Where(a => a.GetIPProperties().GetIPv4Properties() != null) .Where(a => a.GetIPProperties().UnicastAddresses.Any(ua => ua.Address.AddressFamily == AddressFamily.InterNetwork)) .Where(a => a.GetIPProperties().UnicastAddresses.Any(ua => ua.IsDnsEligible)) ) { Console.WriteLine("Network Interface: {0}", netif.Name); IPInterfaceProperties properties = netif.GetIPProperties(); foreach (IPAddressInformation unicast in properties.UnicastAddresses) Console.WriteLine("\tUniCast: {0}", unicast.Address); }
獲得的資訊比較全面,相當於網絡卡的資訊都能獲取,但是不能區分虛擬網絡卡(比如docker)。
嘗試連線一個IP地址
string localIP; using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0)) { socket.Connect("8.8.8.8", 65530); IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint; localIP = endPoint.Address.ToString(); } Console.WriteLine(localIP);
可以避免虛擬網絡卡,但是對於內網地址,不一定適用,同時要求網路必須線上,並且有其他伺服器可以進行連線。
借用DNS解析
using System.Net; string sHostName = Dns.GetHostName(); IPHostEntry ipE = Dns.GetHostEntry(sHostName); IPAddress[] IpA = ipE.AddressList; for (int i = 0; i < IpA.Length; i++) { Console.WriteLine("IP Address {0}: {1} ", i, IpA[i].ToString()); }
IPAddress
還可以繼續通過篩選IPv4的方法進行更精確的選擇,和第一種方法是類似的。操作方法非常簡潔,但是和獲得網絡卡資訊一樣,不能區分虛擬網絡卡。
總結
對於有雙網絡卡的情況,往往兩個網絡卡都是有效的IPV4地址,這個時候需要使用方法2通過區域網或者廣域網內訪問進行區分。當然也可以選擇更為複雜的方式:在區域網內使用廣播服務,然後再抓包確定獲取的網路地址。