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,