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ểm | Nhược điểm |
|---|---|---|
| Dns.GetHostEntry | Đơn giản, built-in | Trả về nhiều IP (VM, Docker, VPN, Loopback), cần filter |
| NetworkInterface | Lọc được interface vật lý, trạng thái Up | Phức tạp hơn, cần permission |
| UDP Connect | Lấ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.RemoteIpAddresscho client IP.