Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Lấy địa chỉ IP trong C#

Lấy địa chỉ IP local (IPv4) của máy tính trong mạng LAN.

Cách 1: Dns.GetHostEntry (Classic)


using System.Net;

public static string GetLocalIPv4()
{
    string hostName = Dns.GetHostName();
    IPHostEntry host = Dns.GetHostEntry(hostName);
    
    foreach (IPAddress ip in host.AddressList)
    {
        if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) // IPv4
            return ip.ToString();
    }
    return "No IPv4 found";
}

Cách 2: LINQ ngắn gọn


public static string GetLocalIPv4()
{
    return Dns.GetHostEntry(Dns.GetHostName())
        .AddressList
        .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork)
        ?.ToString() ?? "No IPv4";
}

Cách 3: Lấy IP của Network Interface cụ thể (Độ tin cậy cao hơn)


using System.Net.NetworkInformation;

public static string GetActiveIPv4()
{
    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
    {
        // Chỉ interface up, không phải loopback, không phải tunnel
        if (ni.OperationalStatus == OperationalStatus.Up 
            && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback
            && ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel)
        {
            var ipProps = ni.GetIPProperties();
            foreach (var addr in ipProps.UnicastAddresses)
            {
                if (addr.Address.AddressFamily == AddressFamily.InterNetwork)
                    return addr.Address.ToString();
            }
        }
    }
    return "No active IPv4";
}

Cách 4: Kết nối UDP giả lập để lấy IP outbound (Public IP local interface)


public static string GetOutboundIP()
{
    using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
    {
        socket.Connect("8.8.8.8", 65530); // Google DNS
        var endPoint = socket.LocalEndPoint as IPEndPoint;
        return endPoint?.Address.ToString() ?? "Unknown";
    }
}

So sánh

Phương phápƯu điểmNhược điểm
Dns.GetHostEntryĐơn giản, built-inTrả về nhiều IP (VM, Docker, VPN, Loopback), cần filter
NetworkInterfaceLọc được interface vật lý, trạng thái UpPhức tạp hơn, cần permission
UDP ConnectLấy IP dùng để ra internet (outbound)Cần network connectivity, tạo socket

Lấy Public IP (WAN IP)


public static async Task GetPublicIPAsync()
{
    using var client = new HttpClient();
    return await client.GetStringAsync("https://api.ipify.org");
    // Hoặc: https://ifconfig.me/ip, https://icanhazip.com
}

Lưu ý

  • Máy tính có thể có nhiều IP (Ethernet, WiFi, Docker, Hyper-V, VPN...).
  • IPv6: AddressFamily.InterNetworkV6.
  • Trong container/Docker, localhost (127.0.0.1) khác host IP.
  • ASP.NET Core: Dùng HttpContext.Connection.RemoteIpAddress cho client IP.