已知主機其中一個 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 GetHostAddresses | GetHostEntry 先做 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。 |
public static async Task GetAllAddressesByIpAsync(string ipAddress)
{
IPHostEntry hostEntry = await Dns.GetHostEntryAsync(ipAddress);
return hostEntry.AddressList;
}
Dns.GetHostEntry 結合反向與正向查詢,能以單一 IP 取得主機所有已登記的 IP 位址,適用於網路掃描、資產盤點、雙向驗證等場景。