You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C#测试指定计算机是否为可正常运行的DNS服务器

C# 测试DNS服务器可用性的实现方案

以下两种实现方案均可实现类似PowerShell中Test-DnsServer的检测能力,核心逻辑为向目标DNS服务器发送DNS查询请求,通过返回结果判定服务是否正常运行。

方案1:第三方DNS客户端库实现(推荐)

使用成熟的DnsClient.NET库实现,无需手动处理DNS协议解析,支持丰富的查询类型和配置项:

  • 第一步:安装NuGet包 DnsClient
  • 代码实现如下:
using DnsClient;
using System.Net;

/// <summary>
/// 检测指定DNS服务器是否可用
/// </summary>
/// <param name="dnsServerIp">DNS服务器IP地址</param>
/// <param name="port">DNS服务端口,默认53</param>
/// <param name="timeoutMilliseconds">超时时间,默认3秒</param>
/// <returns>可用返回true,否则返回false</returns>
public static bool TestDnsServer(string dnsServerIp, int port = 53, int timeoutMilliseconds = 3000)
{
    try
    {
        var lookupClient = new LookupClient(new IPEndPoint(IPAddress.Parse(dnsServerIp), port))
        {
            Timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds),
            Retries = 1
        };
        // 可根据需求修改查询的域名和记录类型
        var queryResult = lookupClient.Query("baidu.com", QueryType.A);
        return !queryResult.HasError && queryResult.Answers.Any();
    }
    catch
    {
        // 所有异常情况均判定为服务不可用
        return false;
    }
}

如果需要匹配Test-DnsServer的权威区检测能力,可将查询类型改为QueryType.SOA,指定对应托管的根域名即可;需要检测反向解析能力的话,调用lookupClient.QueryReverse(IPAddress)方法即可

方案2:原生.NET实现(无第三方依赖)

如果项目不允许引入外部依赖,可手动构造DNS查询报文,基于UDP协议实现轻量检测:

using System.Net;
using System.Net.Sockets;

public static bool TestDnsServerNative(string dnsServerIp, int timeoutMilliseconds = 3000)
{
    try
    {
        var dnsEndpoint = new IPEndPoint(IPAddress.Parse(dnsServerIp), 53);
        using var udpClient = new UdpClient();
        udpClient.Client.ReceiveTimeout = timeoutMilliseconds;

        // 构造DNS A记录查询报文(查询baidu.com)
        byte[] queryBuffer = new byte[32];
        // 会话ID
        queryBuffer[0] = 0x12;
        queryBuffer[1] = 0x34;
        // 标准查询标志
        queryBuffer[2] = 0x01;
        queryBuffer[3] = 0x00;
        // 问题数为1
        queryBuffer[5] = 0x01;

        int offset = 12;
        foreach (var domainPart in "baidu.com".Split('.'))
        {
            queryBuffer[offset++] = (byte)domainPart.Length;
            foreach (var c in domainPart)
            {
                queryBuffer[offset++] = (byte)c;
            }
        }
        queryBuffer[offset++] = 0x00;
        // 查询类型A
        queryBuffer[offset++] = 0x00;
        queryBuffer[offset++] = 0x01;
        // 查询类IN
        queryBuffer[offset++] = 0x00;
        queryBuffer[offset++] = 0x01;

        udpClient.Send(queryBuffer, offset, dnsEndpoint);
        byte[] response = udpClient.Receive(ref dnsEndpoint);

        // 校验响应ID匹配、无错误码
        return response.Length >= 4 
            && response[0] == 0x12 
            && response[1] == 0x34 
            && (response[3] & 0x0F) == 0;
    }
    catch
    {
        return false;
    }
}

原生实现仅适用于轻量检测场景,如果需要支持TCP查询、EDNS、DNSSEC等复杂特性,推荐使用第三方成熟库实现

内容的提问来源于stack exchange,提问作者user3096173

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:06:05