本页内容

QDnsLookup Class

QDnsLookup 类表示一次 DNS 查询。更多内容...

头文件: #include <QDnsLookup>
CMake: find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmake: QT += network
继承自: QObject

公共类型

enum Error { NoError, ResolverError, OperationCancelledError, InvalidRequestError, InvalidReplyError, …, TimeoutError }
enum Protocol { Standard, DnsOverTls }
enum Type { A, AAAA, ANY, CNAME, MX, …, TXT }

属性

公共函数

QDnsLookup(QObject *parent = nullptr)
QDnsLookup(QDnsLookup::Type type, const QString &name, QObject *parent = nullptr)
QDnsLookup(QDnsLookup::Type type, const QString &name, const QHostAddress &nameserver, QObject *parent = nullptr)
(since 6.6) QDnsLookup(QDnsLookup::Type type, const QString &name, const QHostAddress &nameserver, quint16 port, QObject *parent = nullptr)
(since 6.8) QDnsLookup(QDnsLookup::Type type, const QString &name, QDnsLookup::Protocol protocol, const QHostAddress &nameserver, quint16 port = 0, QObject *parent = nullptr)
virtual ~QDnsLookup()
QBindable<QString> bindableName()
QBindable<QHostAddress> bindableNameserver()
QBindable<quint16> bindableNameserverPort()
QBindable<QDnsLookup::Protocol> bindableNameserverProtocol()
QBindable<QDnsLookup::Type> bindableType()
QList<QDnsDomainNameRecord> canonicalNameRecords() const
QDnsLookup::Error error() const
QString errorString() const
QList<QDnsHostAddressRecord> hostAddressRecords() const
bool isAuthenticData() const
bool isFinished() const
QList<QDnsMailExchangeRecord> mailExchangeRecords() const
QString name() const
QList<QDnsDomainNameRecord> nameServerRecords() const
QHostAddress nameserver() const
quint16 nameserverPort() const
QDnsLookup::Protocol nameserverProtocol() const
QList<QDnsDomainNameRecord> pointerRecords() const
QList<QDnsServiceRecord> serviceRecords() const
void setName(const QString &name)
void setNameserver(const QHostAddress &nameserver)
void setNameserver(QDnsLookup::Protocol protocol, const QHostAddress &nameserver, quint16 port = 0)
(since 6.6) void setNameserver(const QHostAddress &nameserver, quint16 port)
void setNameserverPort(quint16 port)
void setNameserverProtocol(QDnsLookup::Protocol protocol)
(since 6.8) void setSslConfiguration(const QSslConfiguration &sslConfiguration)
void setType(QDnsLookup::Type)
QSslConfiguration sslConfiguration() const
QList<QDnsTextRecord> textRecords() const
(since 6.8) QList<QDnsTlsAssociationRecord> tlsAssociationRecords() const
QDnsLookup::Type type() const

公共槽位

void abort()
void lookup()

信号

void finished()
void nameChanged(const QString &name)
void nameserverChanged(const QHostAddress &nameserver)
void nameserverPortChanged(quint16 port)
void nameserverProtocolChanged(QDnsLookup::Protocol protocol)
void typeChanged(QDnsLookup::Type type)

静态公共成员

(since 6.8) quint16 defaultPortForProtocol(QDnsLookup::Protocol protocol)
(since 6.8) bool isProtocolSupported(QDnsLookup::Protocol protocol)

详细说明

QDnsLookup利用操作系统提供的机制来执行DNS查询。要执行查询,您需要指定name 和type ,然后调用lookup()槽函数。查询完成后,将发出finished()信号。

例如,您可以通过以下方式确定 XMPP 聊天客户端应连接到哪个域的哪些服务器:

void MyObject::lookupServers()
{
    // Create a DNS lookup.
    dns = new QDnsLookup(this);
    connect(dns, &QDnsLookup::finished, this, &MyObject::handleServers);

    // Find the XMPP servers for gmail.com
    dns->setType(QDnsLookup::SRV);
    dns->setName("_xmpp-client._tcp.gmail.com");
    dns->lookup();
}

请求完成后,您可以通过以下方式处理结果:

voidMyObject::handleServers()
{
    // 检查查询是否成功。
    if(dns->error()!=QDnsLookup::NoError) {
        qWarning("DNS lookup failed");
        dns->deleteLater();
        return;
    }

    // 处理结果。
    const autorecords= dns->serviceRecords();
    for(constQDnsServiceRecord&record: records) {
        ...
    }
    dns->deleteLater();
}

注意:如果您 只是想查找与某个主机名关联的 IP 地址,或者查找与某个 IP 地址关联的主机名,则应改用QHostInfo 。

DNS-over-TLS 和认证数据

QDnsLookup 在某些平台上支持 DNS-over-TLS(DoT,由RFC 7858 规定)。目前,这包括所有支持常规查询的 Unix 平台,前提是 Qt 中包含对QSslSocket 的支持。若要在运行时查询是否支持该功能,请使用isProtocolSupported()。

在使用 DNS-over-TLS 时,QDnsLookup 仅实现RFC 7858第 4.1 节中描述的“机会性隐私配置文件”(Opportunistic Privacy Profile)身份验证方法。 在此模式下,QDnsLookup(通过QSslSocket )仅验证服务器提供的证书是否适用于所连接的服务器。客户端可使用setSslConfiguration() 设置额外限制,并使用sslConfiguration() 在查询完成后获取相关信息。

QDnsLookup 将要求通过 TLS 进行查询的 DNS 服务器对其返回的数据进行身份验证。如果服务器确认数据有效,则authenticData 属性将设置为 true。QDnsLookup 本身不会验证数据的完整性,因此应用程序仅应信任那些已通过其他方式确认其可信度的服务器的此属性。

不使用 TLS 时的经过身份验证的数据

对于任何设置了 `setNameserver()` 的服务器,QDnsLookup 都会请求“经过身份验证的数据”,即使不需要 TLS 加密也是如此。 这在查询与应用程序位于同一主机或可信网络上的缓存域名服务器时非常有用。虽然这与 TLS 情况类似,但应用程序有责任确定其选择使用的服务器是否可信,以及未加密的连接是否不会被篡改。

QDnsLookup 遵循系统配置,向默认域名服务器请求“Authentic Data”(即未调用setNameserver() 时)。目前仅在使用 glibc 2.31 或更高版本的 Linux 系统上支持此功能。在其他任何系统上,QDnsLookup 将忽略查询头中的 AD 位。

成员类型文档

enum QDnsLookup::Error

表示在处理 DNS 查询过程中发现的所有可能的错误情况。

常量值描述
QDnsLookup::NoError0无错误情况。
QDnsLookup::ResolverError1初始化系统的 DNS 解析器时发生错误。
QDnsLookup::OperationCancelledError2使用abort() 方法中止了查询。
QDnsLookup::InvalidRequestError3请求的 DNS 查询无效。
QDnsLookup::InvalidReplyError4服务器返回的响应无效。
QDnsLookup::ServerFailureError5服务器在处理请求时遇到内部故障(SERVFAIL)。
QDnsLookup::ServerRefusedError6服务器出于安全或策略原因拒绝处理该请求(REFUSED)。
QDnsLookup::NotFoundError7请求的域名不存在(NXDOMAIN)。
QDnsLookup::TimeoutError8无法连接到服务器或服务器未及时响应(自 6.6 版起)。

enum QDnsLookup::Protocol

表示正在查询的 DNS 服务器类型。

常量值描述
QDnsLookup::Standard0常规、未加密的 DNS,使用 UDP,并在必要时回退到 TCP(默认端口:53)
QDnsLookup::DnsOverTls1通过 TLS 传输的加密 DNS(DoT,如RFC 7858 所规定),通过 TCP 传输(默认端口:853)

另请参阅 isProtocolSupported()、nameserverProtocol 以及setNameserver()。

enum QDnsLookup::Type

表示所执行的 DNS 查询类型。

常量值描述
QDnsLookup::A1IPv4 地址记录。
QDnsLookup::AAAA28IPv6 地址记录。
QDnsLookup::ANY255任何记录。
QDnsLookup::CNAME5规范名称记录。
QDnsLookup::MX15邮件交换记录。
QDnsLookup::NS2域名服务器记录。
QDnsLookup::PTR12指针记录。
QDnsLookup::SRV33服务记录。
QDnsLookup::TLSA (since Qt 6.8)52TLS 关联记录。
QDnsLookup::TXT16文本记录。

属性文档

[read-only, since 6.8] authenticData : bool

该属性表示响应是否经过解析器的身份验证。

QDnsLookup 它本身并不执行身份验证。相反,它信任被查询的域名服务器来执行身份验证并报告结果。应用程序负责确定其通过setNameserver() 配置的任何服务器是否可信;如果未设置任何服务器,QDnsLookup 将遵循系统配置来决定是否信任响应。

即使error() 指示发生了解析器错误,该属性仍可被设置。

该枚举类型于 Qt 6.8 中引入。

访问函数:

bool isAuthenticData() const

通知器信号:

void finished()

另请参阅 setNameserver() 和nameserverProtocol()。

[read-only] error : Error

如果 DNS 查询失败,该属性将保存发生的错误类型;否则,该属性值为NoError 。

访问函数:

QDnsLookup::Error error() const

通知信号:

void finished()

[read-only] errorString : QString

如果 DNS 查询失败,该属性将包含该错误的人类可读描述。

访问函数:

QString errorString() const

通知信号:

void finished()

[bindable] name : QString

注意:此 属性支持QProperty 绑定。

该属性存储待查询的名称。

如果要查询的名称为空,QDnsLookup 将尝试解析 DNS 的根域名。该查询通常在将QDnsLookup::type 设置为NS 的情况下执行。

注意:该名称 将使用 IDNA 进行编码,这意味着它不适用于查询符合 DNS-SD 规范的 SRV 记录。

访问函数:

QString name() const
void setName(const QString &name)

通知信号:

void nameChanged(const QString &name)

[bindable] nameserver : QHostAddress

注意:此 属性支持QProperty 绑定。

该属性存储用于 DNS 查询的域名服务器。

访问函数:

QHostAddress nameserver() const
void setNameserver(const QHostAddress &nameserver)
void setNameserver(QDnsLookup::Protocol protocol, const QHostAddress &nameserver, quint16 port = 0)
void setNameserver(const QHostAddress &nameserver, quint16 port)

通知信号:

void nameserverChanged(const QHostAddress &nameserver)

[bindable, since 6.6] nameserverPort : quint16

注意:此 属性支持QProperty 绑定。

该属性存储用于 DNS 查询的域名服务器端口号。

值为 0 表示QDnsLookup 应使用nameserverProtocol() 的默认端口。

注意:如果将端口号设置为 默认值(53)以外的任何值,根据操作系统的限制和防火墙的情况,可能会导致域名解析失败,前提是所使用的nameserverProtocol() 调用的是QDnsLookup::Standard 。值得注意的是,QDnsLookup 所使用的 Windows API 无法处理非默认端口号。

此枚举在 Qt 6.6 中引入。

访问函数:

quint16 nameserverPort() const
void setNameserverPort(quint16 port)

通知器信号:

void nameserverPortChanged(quint16 port)

[bindable, since 6.8] nameserverProtocol : Protocol

注意:此 属性支持QProperty 绑定。

该属性用于指定发送 DNS 查询时所使用的协议

该枚举类型在 Qt 6.8 中引入。

访问函数:

QDnsLookup::Protocol nameserverProtocol() const
void setNameserverProtocol(QDnsLookup::Protocol protocol)

通知信号:

void nameserverProtocolChanged(QDnsLookup::Protocol protocol)

另请参阅 isProtocolSupported()。

[bindable] type : Type

注意:此 属性支持QProperty 绑定。

该属性存储 DNS 查询的类型。

访问函数:

QDnsLookup::Type type() const
void setType(QDnsLookup::Type)

通知信号:

void typeChanged(QDnsLookup::Type type)

成员函数文档

[explicit] QDnsLookup::QDnsLookup(QObject *parent = nullptr)

创建一个 QDnsLookup 对象,并将parent 设置为父对象。

type 属性将默认设置为QDnsLookup::A 。

QDnsLookup::QDnsLookup(QDnsLookup::Type type, const QString &name, QObject *parent = nullptr)

根据给定的type 和name 创建一个QDnsLookup对象,并将parent 设置为父对象。

QDnsLookup::QDnsLookup(QDnsLookup::Type type, const QString &name, const QHostAddress &nameserver, QObject *parent = nullptr)

创建一个 QDnsLookup 对象,用于查询记录类型为type 的name ,使用运行在默认 DNS 端口上的 DNS 服务器nameserver ,并将parent 设置为父对象。

[since 6.6] QDnsLookup::QDnsLookup(QDnsLookup::Type type, const QString &name, const QHostAddress &nameserver, quint16 port, QObject *parent = nullptr)

创建一个 QDnsLookup 对象,用于对记录类型为type 的name 发起查询,使用运行在端口port 上的 DNS 服务器nameserver ,并将parent 设置为父对象。

注意: 如果要使用的nameserverProtocol() 目标为QDnsLookup::Standard,将 端口号设置为 默认值(53)以外的任何值可能会导致域名解析失败,这取决于操作系统的限制和防火墙设置。特别需要注意的是,QDnsLookup 所使用的 Windows API 无法处理非默认端口号。

该函数在 Qt 6.6 中引入。

[since 6.8] QDnsLookup::QDnsLookup(QDnsLookup::Type type, const QString &name, QDnsLookup::Protocol protocol, const QHostAddress &nameserver, quint16 port = 0, QObject *parent = nullptr)

创建一个 QDnsLookup 对象,用于针对记录类型为type 的name 发起查询,使用运行在端口port 上的 DNS 服务器nameserver ,并将parent 设置为父对象。

如果支持,查询将通过protocol 发送。请使用isProtocolSupported() 检查是否支持。

注意:若将 端口号设置为 默认值(53)以外的任何值,且计划使用nameserverProtocol() 进行QDnsLookup::Standard 操作,则根据操作系统限制和防火墙设置的不同,可能会导致名称解析失败。特别需要注意的是,QDnsLookup 所使用的 Windows API 无法处理非默认端口号。

该函数于 Qt 6.8 版本中引入。

[virtual noexcept] QDnsLookup::~QDnsLookup()

销毁QDnsLookup 对象。

即使QDnsLookup 对象尚未完成,删除它也是安全的,只是您将永远无法收到其结果。

[slot] void QDnsLookup::abort()

中止 DNS 查询操作。

如果查询已经完成,则不执行任何操作。

QList<QDnsDomainNameRecord> QDnsLookup::canonicalNameRecords() const

返回与该查询相关的规范名称记录列表。

[static noexcept, since 6.8] quint16 QDnsLookup::defaultPortForProtocol(QDnsLookup::Protocol protocol)

返回协议protocol 的标准(默认)端口号。

该函数在 Qt 6.8 中引入。

另请参阅 isProtocolSupported()。

[signal] void QDnsLookup::finished()

当回复处理完成时,会发出此信号。

注意: 此为属性authenticData 、error 和errorString的通知器 信号。

QList<QDnsHostAddressRecord> QDnsLookup::hostAddressRecords() const

返回与该查询相关的主机地址记录列表。

bool QDnsLookup::isFinished() const

返回回复是否已完成或已被中止。

[static, since 6.8] bool QDnsLookup::isProtocolSupported(QDnsLookup::Protocol protocol)

如果QDnsLookup 支持使用protocol 的 DNS 查询,则返回 true。

该函数在 Qt 6.8 中引入。

另请参阅 nameserverProtocol 。

[slot] void QDnsLookup::lookup()

执行 DNS 查询。

完成后将发出finished()信号。

QList<QDnsMailExchangeRecord> QDnsLookup::mailExchangeRecords() const

返回与该查询相关的邮件交换记录列表。

这些记录是按照RFC 5321 进行排序的,因此如果您要使用它们连接到服务器,应按列表中的顺序依次尝试。

[signal] void QDnsLookup::nameChanged(const QString &name)

当查找项name 发生变化时,会发出此信号。name 是新的查找项名称。

注意: 这是属性name的通知 信号。

QList<QDnsDomainNameRecord> QDnsLookup::nameServerRecords() const

返回与该查询相关的域名服务器记录列表。

QList<QDnsDomainNameRecord> QDnsLookup::pointerRecords() const

返回与该查找操作关联的指针记录列表。

QList<QDnsServiceRecord> QDnsLookup::serviceRecords() const

返回与该查找相关的服务记录列表。

这些记录是按照RFC 2782 进行排序的,因此,如果您要使用它们连接到服务器,应按列表中的顺序依次尝试。

[since 6.6] void QDnsLookup::setNameserver(const QHostAddress &nameserver, quint16 port)

将域名服务器设置为nameserver ,端口设置为port 。

注意:如果将 端口号设置为 默认值(53)以外的任何值,可能会导致域名解析失败,具体取决于操作系统的限制和防火墙设置,尤其是当要使用的nameserverProtocol() 指向QDnsLookup::Standard 时。值得注意的是,QDnsLookup 所使用的 Windows API 无法处理非默认端口号。

注意: 这是属性nameserver 的设置 函数。

该函数于 Qt 6.6 中引入。

另请参阅 QDnsLookup::nameserver 和QDnsLookup::nameserverPort 。

[since 6.8] void QDnsLookup::setSslConfiguration(const QSslConfiguration &sslConfiguration)

设置用于建立出站 DNS-over-TLS 连接的sslConfiguration 。

该函数在 Qt 6.8 中引入。

另请参阅 sslConfiguration() 和QSslSocket::setSslConfiguration()。

QSslConfiguration QDnsLookup::sslConfiguration() const

返回当前的 SSL 配置。

另请参阅 setSslConfiguration()。

QList<QDnsTextRecord> QDnsLookup::textRecords() const

返回与该查找相关的文本记录列表。

[since 6.8] QList<QDnsTlsAssociationRecord> QDnsLookup::tlsAssociationRecords() const

返回与本次查询相关的 TLS 关联记录列表。

根据与基于 DNS 的命名实体认证(DANE)相关的标准,如果无法确认 DNS 响应本身的真实性,则应忽略此字段,且不得将其用于验证给定服务器的真实性。更多信息请参见isAuthenticData()。

该函数于 Qt 6.8 中引入。

[signal] void QDnsLookup::typeChanged(QDnsLookup::Type type)

当查找项type 发生变化时,会发出此信号。type 是新的查找类型。

注意: 这是属性type 的通知器 信号。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.