Qt模块化笔记之network——DNS域名系统与查询功能

本节涉及的类如下:

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<QDnsDomainNameRecord>	canonicalNameRecords() const//下面几个就是返回的"记录类型"了
QList<QDnsHostAddressRecord>	hostAddressRecords() const
QList<QDnsMailExchangeRecord>	mailExchangeRecords() const
QList<QDnsDomainNameRecord>	nameServerRecords() const
QList<QDnsDomainNameRecord>	pointerRecords() const
QList<QDnsServiceRecord>	serviceRecords() const
QList<QDnsTextRecord>	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)

来自Qt project文档的简短代码帮助你理解它的基本使用:

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();
}

QDnsHostAddressRecord的函数有如下几个:

QString	name() const//返回我们查找的域名
QHostAddress	value() const//找向的IP地址
quint32	timeToLive() const//即TTL了
void	swap(QDnsHostAddressRecord & other)
QDnsHostAddressRecord &	operator=(const QDnsHostAddressRecord & other)

以下按上面示例再写一个小例子,以查找我们的haiying.tk相关信息。

#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QDnsHostAddressRecord>
#include <QHostAddress>
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()<<record.name();
            qDebug()<<record.value();
            qDebug()<<record.timeToLive();
        }
        dns->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,


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值