一台電腦擁有 單一主機名稱,但可能擁有 多個 IP 位址 (區域網路固定 IP、撥號/VPN 動態 IP、回環位址、IPv6 等)。需分別讀取並顯示。
System.Net.DnsGetHostName():傳回本機主機名稱 (字串)。GetHostEntry(string hostName):傳回 IPHostEntry,包含 AddressList (IPAddress[]) —— 所有 IP 位址。GetHostByName 已過時,功能相同但僅支援 IPv4)。
using System;
using System.Net;
using System.Windows.Forms;
public class IpForm : Form
{
private Label lblHost, lblIps;
public IpForm()
{
Text = "主機名稱與 IP 位址"; ClientSize = new Size(400, 200);
lblHost = new Label { Location = new Point(20,20), AutoSize = true, Font = new Font("微軟正黑體", 10, FontStyle.Bold) };
lblIps = new Label { Location = new Point(20,60), Size = new Size(360,120), Font = new Font("Consolas", 9) };
Controls.AddRange(new Control[]{lblHost, lblIps});
Load += IpForm_Load;
}
private void IpForm_Load(object sender, EventArgs e)
{
string host = Dns.GetHostName();
lblHost.Text = $"主機名稱: {host}";
try
{
var hostEntry = Dns.GetHostEntry(host);
var sb = new System.Text.StringBuilder();
sb.AppendLine("所有 IP 位址:");
foreach (var ip in hostEntry.AddressList)
{
sb.AppendLine($" {ip.AddressFamily}: {ip}");
}
lblIps.Text = sb.ToString();
}
catch (Exception ex)
{
lblIps.Text = "取得 IP 失敗: " + ex.Message;
}
}
[STAThread]
static void Main() => Application.Run(new IpForm());
}
主機名稱: MY-PC
所有 IP 位址:
InterNetwork: 192.168.1.50
InterNetwork: 10.0.0.5
InterNetworkV6: fe80::1234:5678:9abc:def0%12
InterNetworkV6: ::1
InterNetwork: 127.0.0.1
InterNetwork = IPv4,InterNetworkV6 = IPv6。127.0.0.1 / ::1 為回環位址。fe80::... 為 Link-Local IPv6。InterNetwork 位址。
// 僅取得 IPv4 非回環位址
var ipv4 = hostEntry.AddressList
.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip))
.ToList();
原文使用 Dns.GetHostByName(...).AddressList[0] 取第一個 IPv4,[1] 取第二個。此做法不穩定:陣列順序不保證,且忽略 IPv6。請改用 GetHostEntry 遍歷 AddressList。
System.Net.Dns 提供簡潔跨平台方式取得主機名稱與完整 IP 清單。遍歷 AddressList 並依 AddressFamily 篩選,即可精準獲取所需位址類型。