1. 程式人生 > >Qt模組化筆記之network——DNS域名系統與查詢功能

Qt模組化筆記之network——DNS域名系統與查詢功能

本節涉及的類如下:

DNS 是域名系統 (Domain Name System) 的縮寫。

域名即我們在瀏覽器中輸入的網址字串。它將送到提供域名解析服務的系統中,如國內可以使用的,提供免費DNS解析服務的服務商:http://www.dnspod.cn/。它在這裡會被轉成目標伺服器所在的IP,進而我們的瀏覽器可以訪問伺服器的資源了。

下面介紹搭建一個網站來了解DNS。

三者具備後,在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外的幾個,通過這些類可以獲取相關資訊。

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()//停止查詢

Signals


來自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,