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

C# 域名解析 IP 實作:Dns.GetHostEntry 同步/非同步用法與例外處理

     編輯:關於C#

同步版(.NET Framework / .NET Core 通用)


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);
    }
}

非同步版(避免阻塞 UI 執行緒)


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 方法同上
}

進階:指定 DNS 伺服器(需第三方庫)

.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域名不存在提示使用者檢查拼字
TryAgainDNS 暫時失敗指數退避重試 2-3 次
NoRecovery永久性錯誤記錄日誌、人工介入
NoData域名存在但無 A 記錄嘗試 AAAA (IPv6) 或 CNAME
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved