首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 取得電腦名稱與所有 IP 位址:System.Net.Dns 實戰

     編輯:關於C語言

需求分析

一台電腦擁有 單一主機名稱,但可能擁有 多個 IP 位址 (區域網路固定 IP、撥號/VPN 動態 IP、回環位址、IPv6 等)。需分別讀取並顯示。

核心 API:System.Net.Dns

  • GetHostName():傳回本機主機名稱 (字串)。
  • GetHostEntry(string hostName):傳回 IPHostEntry,包含 AddressList (IPAddress[]) —— 所有 IP 位址。
    (舊版 GetHostByName 已過時,功能相同但僅支援 IPv4)。

完整 WinForms 範例


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。
  • 撥號/VPN 介面啟動時會動態新增 InterNetwork 位址。

進階:依介面類型篩選


// 僅取得 IPv4 非回環位址
var ipv4 = hostEntry.AddressList
    .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip))
    .ToList();

舊版代碼對照 (僅 IPv4)

原文使用 Dns.GetHostByName(...).AddressList[0] 取第一個 IPv4,[1] 取第二個。此做法不穩定:陣列順序不保證,且忽略 IPv6。請改用 GetHostEntry 遍歷 AddressList。

結語

System.Net.Dns 提供簡潔跨平台方式取得主機名稱與完整 IP 清單。遍歷 AddressList 並依 AddressFamily 篩選,即可精準獲取所需位址類型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved