欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# System.Net.Dns 使用詳解

 更新時間:2025年07月31日 09:37:59   作者:鯉籽鯤  
System.Net.Dns類提供了一組靜態(tài)方法,用于執(zhí)行與DNS相關(guān)的操作,本文主要介紹了C# System.Net.Dns使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

前言

在網(wǎng)絡(luò)編程中,域名系統(tǒng)(DNS)是互聯(lián)網(wǎng)的核心組成部分之一,它將人類可讀的域名轉(zhuǎn)換為機器可用的IP地址。在.NET框架中,System.Net.Dns類提供了一組靜態(tài)方法,用于執(zhí)行與DNS相關(guān)的操作。本文將詳細介紹如何使用System.Net.Dns類來查詢和解析DNS信息。

一、什么是 System.Net.Dns ?

1. 定義

System.Net.Dns是.NET框架中處理DNS解析的靜態(tài)類,提供同步與異步方法,支持IPv4/IPv6雙協(xié)議棧,能夠?qū)⒂蛎D(zhuǎn)換為IP地址(正向解析)或IP地址轉(zhuǎn)換為主機名(反向解析)。其核心輸出類型為IPHostEntry,封裝主機名、別名及IP地址列表等信息。

2. 核心功能特性

  • 域名解析:支持www.example.com192.0.2.1
  • 反向解析192.0.2.1server.example.com
  • 本地網(wǎng)絡(luò)信息獲取:本機主機名、多網(wǎng)卡IP地址查詢
  • 異步支持:避免阻塞主線程,提升應(yīng)用響應(yīng)速度

二、主要功能

1. 本地信息獲取

1)獲取本地主機名稱

Dns.GetHostName 方法用于獲取本地主機的名稱(計算機名稱)。

string hostName = Dns.GetHostName();
Console.WriteLine("本地主機名稱: " + hostName);

技術(shù)細節(jié):此方法直接讀取操作系統(tǒng)注冊的主機名,無需網(wǎng)絡(luò)請求。

2)獲取本機所有IP地址

//獲取完整本地信息
var hostEntry = Dns.GetHostEntry(Dns.GetHostName());  
foreach (IPAddress ip in hostEntry.AddressList)  
{  
    if (ip.AddressFamily == AddressFamily.InterNetwork)  
        Console.WriteLine($"IPv4地址: {ip}");  
    else if (ip.AddressFamily == AddressFamily.InterNetworkV6)  
        Console.WriteLine($"IPv6地址: {ip}");  
}  

優(yōu)化技巧:過濾虛擬網(wǎng)卡或非活動接口,使用NetworkInterface類精細控制。

2. 解析域名到IP地址

使用Dns.GetHostAddresses方法,可以通過給定的域名獲取對應(yīng)的IP地址列表:

IPAddress[] addresses = Dns.GetHostAddresses("www.baidu.com");
foreach (IPAddress address in addresses)
{
    Console.WriteLine($"IP 地址: {address}");
}

輸出:

IP 地址: 180.101.51.73
IP 地址: 180.101.49.44

3. 獲取指定主機信息

為了獲取關(guān)于特定主機的詳細信息,包括主機名、別名以及IP地址列表,可以使用Dns.GetHostEntry方法:

IPHostEntry hostInfo = Dns.GetHostEntry("www.baidu.com");
Console.WriteLine("主機名: " + hostInfo.HostName);
foreach (IPAddress ip in hostInfo.AddressList)
{
    Console.WriteLine("IP 地址: " + ip.ToString());
}
foreach (string alias in hostInfo.Aliases)
{
    Console.WriteLine("別名: " + alias);
}

4. 反向解析 IP 地址到主機名

有時我們需要根據(jù)一個IP地址找到其對應(yīng)的域名,這時可以使用Dns.GetHostEntry方法,并傳入一個IP地址作為參數(shù):

IPAddress ip = IPAddress.Parse("8.8.8.8");
IPHostEntry reverseEntry = Dns.GetHostEntry(ip);
Console.WriteLine("解析回主機名: " + reverseEntry.HostName);

請注意,不是所有的IP地址都能成功進行反向DNS查找,這取決于IP地址的所有者是否配置了PTR記錄。

5. 示例

class Program
{
    static void Main()
    {
        try
        {
            // 使用主機名解析
            IPHostEntry hostEntry = Dns.GetHostEntry("example.com");
            Console.WriteLine("主機名: " + hostEntry.HostName);
            Console.WriteLine("別名: " + String.Join(", ", hostEntry.Aliases));
            Console.WriteLine("IP 地址: " + String.Join(", ", hostEntry.AddressList));

            // 使用 IP 地址解析
            IPAddress ipAddress = IPAddress.Parse("93.184.216.34");
            IPHostEntry hostEntryByIP = Dns.GetHostEntry(ipAddress);
            Console.WriteLine("通過 IP 地址解析得到的主機名: " + hostEntryByIP.HostName);
        }
        catch (SocketException ex)
        {
            Console.WriteLine("解析失敗: " + ex.Message);
        }
    }
}

三、高級應(yīng)用場景

1. 異步解析

1)BeginGetHostEntry + EndGetHostEntry

System.Net.Dns 類還提供了一些異步方法,如 BeginGetHostEntry()EndGetHostEntry(),用于異步執(zhí)行 DNS 查詢。這對于需要提高響應(yīng)速度和避免阻塞主線程的網(wǎng)絡(luò)應(yīng)用程序來說非常有用。

class Program
{
    static void Main()
    {
        IAsyncResult result = Dns.BeginGetHostEntry("example.com", new AsyncCallback(ResolveCallback), null);
        Console.WriteLine("等待異步解析完成...");
        result.AsyncWaitHandle.WaitOne();
    }

    static void ResolveCallback(IAsyncResult ar)
    {
        try
        {
            IPHostEntry hostEntry = Dns.EndGetHostEntry(ar);
            Console.WriteLine("異步解析完成,主機名: " + hostEntry.HostName);
        }
        catch (SocketException ex)
        {
            Console.WriteLine("異步解析失敗: " + ex.Message);
        }
    }
}

2)GetHostEntryAsync

Dns.GetHostEntryAsync 方法允許異步解析主機名或 IP 地址。

IPHostEntry hostEntry = await Dns.GetHostEntryAsync("www.example.com");
Console.WriteLine("IP 地址:");
foreach (IPAddress ip in hostEntry.AddressList)
{
    Console.WriteLine(ip);
}
public async Task ResolveDomainAsync(string domain)
{
    try
    {
        IPHostEntry entry = await Dns.GetHostEntryAsync(domain);
        // 處理解析結(jié)果
    }
    catch (SocketException ex)
    {
        Console.WriteLine($"解析失敗: {ex.SocketErrorCode}");
    }
}

2. 解析超時控制

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
try
{
    IPHostEntry entry = await Dns.GetHostEntryAsync("slow.domain", cts.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("DNS查詢超時");
}

3. 多網(wǎng)絡(luò)接口IP篩選

針對服務(wù)器多網(wǎng)卡環(huán)境,精確獲取指定接口IP:

var interfaces = NetworkInterface.GetAllNetworkInterfaces()  
    .Where(n => n.OperationalStatus == OperationalStatus.Up);  

foreach (var ni in interfaces)  
{  
    var ips = ni.GetIPProperties().UnicastAddresses  
        .Where(addr => addr.Address.AddressFamily == AddressFamily.InterNetwork);  
    Console.WriteLine($"接口 {ni.Name} 的IPv4地址:");  
    foreach (var ip in ips)  
        Console.WriteLine(ip.Address);  
}  

應(yīng)用場景:容器化部署中區(qū)分內(nèi)網(wǎng)/公網(wǎng)流量。

4. 并行解析多個主機名

可以使用 Task.WhenAll 方法并行解析多個主機名。

string[] hostNames = { "www.example.com", "www.google.com", "www.microsoft.com" };
Task<IPHostEntry>[] tasks = hostNames.Select(host => Dns.GetHostEntryAsync(host)).ToArray();
IPHostEntry[] hostEntries = await Task.WhenAll(tasks);
for (int i = 0; i < hostNames.Length; i++)
{
    Console.WriteLine($"主機名: {hostNames[i]}");
    Console.WriteLine($"IP 地址: {string.Join(", ", hostEntries[i].AddressList)}");
    Console.WriteLine(new string('-', 20));
}

四、常見問題解答

Q:如何處理IPv6回退?

var addresses = Dns.GetHostAddresses(host)
                  .OrderBy(a => a.AddressFamily == AddressFamily.InterNetwork ? 0 : 1);

Q:如何強制刷新DNS緩存?

// Windows系統(tǒng)調(diào)用
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCache")]
private static extern uint DnsFlushResolverCache();

public void FlushDnsCache()
{
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        DnsFlushResolverCache();
    }
}

Q:強制使用IPv4協(xié)議

var hostEntry = Dns.GetHostEntry("www.example.com");  
IPAddress ipv4 = hostEntry.AddressList  
    .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);  

五、擴展應(yīng)用:自定義DNS解析

1. 使用第三方庫(ARSoft.Tools.Net)

實現(xiàn)高級DNS查詢(如MX記錄、TXT記錄):

var dnsClient = new DnsClient(IPAddress.Parse("8.8.8.8"), 5000);  
DnsMessage response = dnsClient.Resolve("example.com", RecordType.MX);  
foreach (var record in response.AnswerRecords)  
{  
    if (record is MxRecord mx)  
        Console.WriteLine($"郵件服務(wù)器: {mx.Exchange} (優(yōu)先級: {mx.Preference})");  
}  

優(yōu)勢:支持DNS協(xié)議擴展,適合特殊記錄類型查詢。

參考資料

到此這篇關(guān)于C# System.Net.Dns 使用詳解的文章就介紹到這了,更多相關(guān)C# System.Net.Dns內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論