本节涉及的类如下:
QDnsLookup
QDnsDomainNameRecord
QDnsHostAddressRecord
QDnsMailExchangeRecord
QDnsServiceRecord
QDnsTextRecord
DNS 是域名系统 (Domain Name System) 的缩写。
域名即我们在浏览器中输入的网址字符串。它将送到提供域名解析服务的系统中,如国内可以使用的,提供免费DNS解析服务的服务商:http://www.dnspod.cn/。它在这里会被转成目标服务器所在的IP,进而我们的浏览器可以访问服务器的资源了。
下面介绍搭建一个网站来了解DNS。
如果你要尝试的话,可申请使用免费的域名TK(http://my.dot.tk/),免费的域名解析服务(https://www.dnspod.cn),及一些免费的空间,用于存储你的网站文件。
三者具备后,在dot.tk中,我申请了个haiying.tk域名,其设置如下:
custom DNS即用我们自定义的DNS服务,下面两个Host Name都是dnspod.cn提供给我们的DNS解析服务商的地址,填入后,当访问haiying.tk时,它会送到dnspod上解析。
在dnspod上,我们为这个域名设置如下:
第一条,A记录是最为常用的记录类型了,它用于指定网站空间的IP地址。
第四条记录,当我们访问"www.haiying.tk"时,它使用别名记录,跳转到hao123首页。
TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上缓存时间。
一般网站仅需要这样设置,但对于支持邮件功能及其它特殊的,需要添加其它记录。
当添加记录,指向各所需填的空时,它给我们的提示如下:
我只能带你了解到这了,更为细节的东东,自己百度吧。
——————————————————————————————————————————————————————————————————
本节最重要的类QDnsLookup,通过其setName(QString) 函数,设置域名,然后可以执行其槽函数void lookup()即可实现查询,查询结果即它的各种“记录”分为几种,Qt为每种结果都提供了一个类来描述它们,即上面列表中除QDnsLookup外的几个,通过这些类可以获取相关信息。
查看QDnsLookup:
public fns:
QDnsLookup(QObject * parent = 0)
QDnsLookup(Type type, const QString & name, QObject * parent = 0)
~QDnsLookup()
void setType(QDnsLookup::Type)//设置所需要查的域名的记录类别,枚举值1
void setName(const QString & name)//设置需要查找的域名字符串
Type type() const
QString name() const
Error error() const//返回查找出错信息类型
QString errorString() const//出错信息内容
bool isFinished() const//查找过程是否已结束
QList canonicalNameRecords() const//下面几个就是返回的"记录类型"了
QList hostAddressRecords() const
QList mailExchangeRecords() const
QList nameServerRecords() const
QList pointerRecords() const
QList serviceRecords() const
QList textRecords() const
1,enum QDnsLookup::Type
Constant | Value | Description |
---|---|---|
QDnsLookup::A | 1 | IPv4地址记录 |
QDnsLookup::AAAA | 28 | IPv6 地址记录 |
QDnsLookup::ANY | 255 | 任何记录 |
QDnsLookup::CNAME | 5 | 别名记录(该记录值为另一个域名) |
QDnsLookup::MX | 15 | 邮件交换记录 |
QDnsLookup::NS | 2 | 域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。 |
QDnsLookup::PTR | 12 | PTR记录,是电子邮件系统中的邮件交换记录的一种; |
QDnsLookup::SRV | 33 | 记录了哪台计算机提供了哪个服务 |
QDnsLookup::TXT | 16 | TXT记录,一般指为某个主机名或域名设置的说明, |
Public Slots
void | abort()//停止查找 |
void | lookup() |
Signals
void | finished() |
void | nameChanged(const QString & name) |
void | typeChanged(Type type) |
void MyObject::lookupServers()
{
// Create a DNS lookup.
dns = new QDnsLookup(this);
connect(dns, SIGNAL(finished()),
this, SLOT(handleServers()));
// Find the XMPP servers for gmail.com
dns->setType(QDnsLookup::SRV);
dns->setName("_xmpp-client._tcp.gmail.com");
dns->lookup();
}
void MyObject::handleServers()
{
// Check the lookup succeeded.
if (dns->error() != QDnsLookup::NoError) {
qWarning("DNS lookup failed");
dns->deleteLater();
return;
}
// Handle the results.
foreach (const QDnsServiceRecord &record, dns->serviceRecords()) {
//这里处理&record的信息,这几个记录类都是很相似的,下方以HostAddressRecord(A记录)为例
}
dns->deleteLater();
}
QString name() const//返回我们查找的域名
QHostAddress value() const//找向的IP地址
quint32 timeToLive() const//即TTL了
void swap(QDnsHostAddressRecord & other)
QDnsHostAddressRecord & operator=(const QDnsHostAddressRecord & other)
#include "dialog.h"
#include "ui_dialog.h"
#include
#include
#include
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
dns = new QDnsLookup(this);
connect(dns, SIGNAL(finished()),
this, SLOT(handleServers()));
dns->setType(QDnsLookup::A);
dns->setName("haiying.tk");
dns->lookup();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::handleServers()
{
if (dns->error() != QDnsLookup::NoError) {
qWarning("DNS lookup failed");
dns->deleteLater();
return;
}
foreach (const QDnsHostAddressRecord &record, dns->hostAddressRecords()) {
qDebug()<deleteLater();
}
输出如下:
"haiying.tk"//这里只返回第一条IP记录信息,"www.haiying.tk"的解析就会是别名信息了
QHostAddress( "198.148.94.24" )
600
"f1g1ns2.dnspod.net"
QHostAddress( "122.225.217.191" )
600
"f1g1ns2.dnspod.net"
QHostAddress( "180.153.162.150" )
600
"f1g1ns2.dnspod.net"
QHostAddress( "182.140.167.188" )
600
"f1g1ns2.dnspod.net"
QHostAddress( "112.90.143.29" )
600
与我们对它这个域名的DNS解析设置是一致的。而且可以看到, f1g1ns2.dnspod.net这个解析服务提供商有多个IP,