public string ResolveIp(string domain)
{
try
{
IPHostEntry entry = Dns.GetHostEntry(domain);
// 取第一個 IPv4 位址
foreach (IPAddress ip in entry.AddressList)
if (ip.AddressFamily == AddressFamily.InterNetwork)
return ip.ToString();
throw new Exception("無 IPv4 位址");
}
catch (SocketException ex)
{
throw new Exception($"DNS 解析失敗: {ex.SocketErrorCode}", ex);
}
}
public async Task ResolveIpAsync(string domain)
{
try
{
IPHostEntry entry = await Dns.GetHostEntryAsync(domain);
return entry.AddressList
.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork)
?.ToString() ?? throw new Exception("無 IPv4 位址");
}
catch (SocketException ex)
{
throw new Exception($"DNS 解析失敗: {ex.SocketErrorCode}", ex);
}
}
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Usage: ResolveIp.exe ");
return;
}
try
{
string ip = ResolveIp(args[0]);
Console.WriteLine(ip);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
Environment.ExitCode = 1;
}
}
// ... ResolveIp 方法同上
}
.NET 內建 Dns 類別僅使用系統預設 DNS。若需指定 8.8.8.8 或企業內部 DNS,請使用 DnsClient.NET:
var lookup = new LookupClient(IPAddress.Parse("8.8.8.8"));
var result = await lookup.QueryAsync(domain, QueryType.A);
string ip = result.Answers.ARecords().First().Address.ToString();
| SocketErrorCode | 含義 | 處理建議 |
|---|---|---|
HostNotFound | 域名不存在 | 提示使用者檢查拼字 |
TryAgain | DNS 暫時失敗 | 指數退避重試 2-3 次 |
NoRecovery | 永久性錯誤 | 記錄日誌、人工介入 |
NoData | 域名存在但無 A 記錄 | 嘗試 AAAA (IPv6) 或 CNAME |