QDnsLookup
类用于执行 DNS (Domain Name System) 查找。它允许你查询与特定主机名关联的各种 DNS 记录,例如 IP 地址 (A 和 AAAA 记录)、邮件交换 (MX) 记录、名称服务器 (NS) 记录等。
这是一个异步类,意味着当你发起一个 DNS 请求时,它不会阻塞你的应用程序。相反,它会发出信号来通知你查找的进度和结果。
主要功能和用法:
-
创建和配置:
- 创建一个
QDnsLookup
对象。 - 使用
setType()
方法指定要查询的 DNS 记录类型 (例如QDnsLookup::A
,QDnsLookup::AAAA
,QDnsLookup::MX
,QDnsLookup::TXT
,QDnsLookup::CNAME
,QDnsLookup::NS
,QDnsLookup::PTR
,QDnsLookup::SRV
)。 - 使用
setName()
方法设置要查询的主机名。
- 创建一个
-
发起查找:
- 调用
lookup()
方法开始 DNS 查找。这是一个非阻塞调用。
- 调用
-
处理结果:
- 连接到
finished()
信号。当查找完成 (无论成功还是失败) 时,此信号会被发出。 - 在
finished()
信号的槽函数中:- 检查
error()
方法以确定查找是否成功。如果error()
返回QDnsLookup::NoError
,则查找成功。 - 如果成功,可以通过调用相应的记录类型方法来获取结果,例如:
hostAddressRecords()
: 获取QHostAddressRecord
列表 (A 和 AAAA 记录)。mailExchangeRecords()
: 获取QDnsMailExchangeRecord
列表 (MX 记录)。nameServerRecords()
: 获取QDnsDomainNameRecord
列表 (NS 记录)。textRecords()
: 获取QDnsTextRecord
列表 (TXT 记录)。canonicalNameRecords()
: 获取QDnsDomainNameRecord
列表 (CNAME 记录)。pointerRecords()
: 获取QDnsDomainNameRecord
列表 (PTR 记录,用于反向 DNS 查找)。serviceRecords()
: 获取QDnsServiceRecord
列表 (SRV 记录)。
- 如果发生错误,
errorString()
方法会提供错误的文本描述。
- 检查
- 连接到
简单示例 (概念性):
#include <QDnsLookup>
#include <QCoreApplication>
#include <QHostAddress>
#include <QDebug>
class DnsQuery : public QObject
{
Q_OBJECT
public:
DnsQuery(QObject *parent = nullptr) : QObject(parent) {
dns = new QDnsLookup(this);
connect(dns, &QDnsLookup::finished, this, &DnsQuery::handleResults);
}
void lookupAddress(const QString& name) {
dns->setType(QDnsLookup::A); // 查询 A 记录 (IPv4)
dns->setName(name);
dns->lookup();
qDebug() << "Looking up A records for:" << name;
}
public slots:
void handleResults() {
if (dns->error() != QDnsLookup::NoError) {
qWarning() << "DNS lookup failed:" << dns->errorString();
QCoreApplication::instance()->quit();
return;
}
const auto records = dns->hostAddressRecords();
if (records.isEmpty()) {
qDebug() << "No A records found for" << dns->name();
} else {
qDebug() << "A Records for" << dns->name() << ":";
for (const QDnsHostAddressRecord &record : records) {
qDebug() << " IP Address:" << record.value().toString()
<< "TTL:" << record.timeToLive();
}
}
QCoreApplication::instance()->quit();
}
private:
QDnsLookup *dns;
};
#include "main.moc" // 如果使用 qmake 并且 DnsQuery 在 .cpp 文件中
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
DnsQuery query;
query.lookupAddress("www.qt.io");
return a.exec();
}
关键点:
- 异步性:
QDnsLookup
的核心特性,避免阻塞主线程。 - 信号和槽: 用于处理查找完成的事件。
- 错误处理: 务必检查
error()
来判断查找是否成功。 - 多种记录类型: 支持查询常见的 DNS 记录。
QDnsLookup
是 Qt 网络模块 (QtCore.QtNetwork
如果在 Python/PySide/PyQt 中) 的一部分,为应用程序提供了强大的 DNS 解析能力。