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

C# 透過 DNS 反向查詢取得主機所有 IP 位址

     編輯:關於C#

情境

已知主機其中一個 IP (如 192.168.1.2),需取得該主機在 DNS 登記的所有 IP 位址 (包含多網卡、IPv6 等)。

核心程式碼

using System;
using System.Net;

public static class DnsHelper
{
    /// 
    /// 依 IP 位址反向查詢主機名稱,並回傳所有解析到的 IP 位址
    /// 
    public static IPAddress[] GetAllAddressesByIp(string ipAddress)
    {
        if (string.IsNullOrWhiteSpace(ipAddress))
            throw new ArgumentException("IP 位址不可為空", nameof(ipAddress));

        // 1. 反向查詢主機項目
        IPHostEntry hostEntry = Dns.GetHostEntry(ipAddress);

        // 2. 回傳位址清單 (含 IPv4 與 IPv6)
        return hostEntry.AddressList;
    }
}

使用範例

string knownIp = "192.168.1.2";
try
{
    IPAddress[] addresses = DnsHelper.GetAllAddressesByIp(knownIp);
    Console.WriteLine($"主機 {knownIp} 解析到 {addresses.Length} 個位址:");
    foreach (var ip in addresses)
    {
        Console.WriteLine($"  {ip} ({ip.AddressFamily})");
    }
}
catch (System.Net.Sockets.SocketException ex)
{
    Console.WriteLine($"DNS 查詢失敗: {ex.Message} (錯誤碼: {ex.SocketErrorCode})");
}

輸出範例

主機 192.168.1.2 解析到 3 個位址:
  192.168.1.2 (InterNetwork)
  192.168.10.5 (InterNetwork)
  fe80::a1b2:c3d4:e5f6:7890 (InterNetworkV6)

關鍵細節與避坑

項目說明
Dns.GetHostEntry vs GetHostAddressesGetHostEntry 先做 PTR 反向查詢取得主機名,再做 A/AAAA 正向查詢;GetHostAddresses 僅正向查詢。本文需求需反向查詢,故用 GetHostEntry。
DNS 快取Windows DNS Client 服務會快取結果;若 IP 異動後查詢仍舊,可 ipconfig /flushdns 或重啟 DNS Client 服務。
多宿主主機一台主機多張網卡、多 IP 時,PTR 紀錄可能僅指向單一主機名,正向查詢會回傳所有 A/AAAA 紀錄。
IPv6 連結本位址fe80:: 開頭為 Link-Local 位址,僅本區段有效,非公開路由位址。
例外處理找不到 PTR 紀錄會拋 SocketException (ErrorCode 11001 HOST_NOT_FOUND),務必 try-catch。

進階:非同步版本 (.NET Core / .NET 5+)

public static async Task GetAllAddressesByIpAsync(string ipAddress)
{
    IPHostEntry hostEntry = await Dns.GetHostEntryAsync(ipAddress);
    return hostEntry.AddressList;
}

總結

Dns.GetHostEntry 結合反向與正向查詢,能以單一 IP 取得主機所有已登記的 IP 位址,適用於網路掃描、資產盤點、雙向驗證等場景。

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