C#獲得本地IP地址的各種方法


網上有很多種方法可以獲取到本地的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通過局域網或者廣域網內訪問進行區分。當然也可以選擇更為復雜的方式:在局域網內使用廣播服務,然后再抓包確定獲取的網絡地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM