分享

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

 紫殿 2015-01-16

本节涉及的类如下:

QDnsLookup

QDnsDomainNameRecord

QDnsHostAddressRecord

QDnsMailExchangeRecord

QDnsServiceRecord

QDnsTextRecord


DNS 是域名系统 (Domain Name System) 的缩写。

域名即我们在浏览器中输入的网址字符串。它将送到提供域名解析服务的系统中,如国内可以使用的,提供免费DNS解析服务的服务商:http://www./。它在这里会被转成目标服务器所在的IP,进而我们的浏览器可以访问服务器的资源了。

下面介绍搭建一个网站来了解DNS。

如果你要尝试的话,可申请使用免费的域名TK(http://my./),免费的域名解析服务(https://www.),及一些免费的空间,用于存储你的网站文件。

三者具备后,在中,我申请了个haiying.tk域名,其设置如下:


custom DNS即用我们自定义的DNS服务,下面两个Host Name都是提供给我们的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:

  1.     QDnsLookup(QObject * parent = 0)  
  2.     QDnsLookup(Type type, const QString & name, QObject * parent = 0)  
  3.     ~QDnsLookup()  
  4.   
  5. void    setType(QDnsLookup::Type)//设置所需要查的域名的记录类别,枚举值1  
  6. void    setName(const QString & name)//设置需要查找的域名字符串  
  7.   
  8. Type    type() const  
  9. QString name() const  
  10.   
  11. Error   error() const//返回查找出错信息类型  
  12. QString errorString() const//出错信息内容  
  13. bool    isFinished() const//查找过程是否已结束  
  14.   
  15. QList<QDnsDomainNameRecord>   canonicalNameRecords() const//下面几个就是返回的"记录类型"了  
  16. QList<QDnsHostAddressRecord>  hostAddressRecords() const  
  17. QList<QDnsMailExchangeRecord> mailExchangeRecords() const  
  18. QList<QDnsDomainNameRecord>   nameServerRecords() const  
  19. QList<QDnsDomainNameRecord>   pointerRecords() const  
  20. QList<QDnsServiceRecord>  serviceRecords() const  
  21. 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文档的简短代码帮助你理解它的基本使用:
  1. void MyObject::lookupServers()  
  2. {  
  3.     // Create a DNS lookup.  
  4.     dns = new QDnsLookup(this);  
  5.     connect(dns, SIGNAL(finished()),  
  6.             this, SLOT(handleServers()));  
  7.   
  8.     // Find the XMPP servers for gmail.com  
  9.     dns->setType(QDnsLookup::SRV);  
  10.     dns->setName("_xmpp-client._tcp.gmail.com");  
  11.     dns->lookup();  
  12. }  
  13. void MyObject::handleServers()  
  14. {  
  15.     // Check the lookup succeeded.  
  16.     if (dns->error() != QDnsLookup::NoError) {  
  17.         qWarning("DNS lookup failed");  
  18.         dns->deleteLater();  
  19.         return;  
  20.     }  
  21.   
  22.     // Handle the results.  
  23.     foreach (const QDnsServiceRecord &record, dns->serviceRecords()) {  
  24.         //这里处理&record的信息,这几个记录类都是很相似的,下方以HostAddressRecord(A记录)为例  
  25.     }  
  26.     dns->deleteLater();  
  27. }  

QDnsHostAddressRecord的函数有如下几个:
  1. QString name() const//返回我们查找的域名  
  2. QHostAddress    value() const//找向的IP地址  
  3. quint32 timeToLive() const//即TTL了  
  4. void    swap(QDnsHostAddressRecord & other)  
  5. QDnsHostAddressRecord & operator=(const QDnsHostAddressRecord & other)  

以下按上面示例再写一个小例子,以查找我们的haiying.tk相关信息。
  1. #include "dialog.h"  
  2. #include "ui_dialog.h"  
  3. #include <QDebug>  
  4. #include <QDnsHostAddressRecord>  
  5. #include <QHostAddress>  
  6. Dialog::Dialog(QWidget *parent) :  
  7.     QDialog(parent),  
  8.     ui(new Ui::Dialog)  
  9. {  
  10.     ui->setupUi(this);  
  11.     dns = new QDnsLookup(this);  
  12.         connect(dns, SIGNAL(finished()),  
  13.                 this, SLOT(handleServers()));  
  14.   
  15.         dns->setType(QDnsLookup::A);  
  16.         dns->setName("haiying.tk");  
  17.         dns->lookup();  
  18. }  
  19.   
  20. Dialog::~Dialog()  
  21. {  
  22.     delete ui;  
  23. }  
  24.   
  25. void Dialog::handleServers()  
  26. {  
  27.     if (dns->error() != QDnsLookup::NoError) {  
  28.             qWarning("DNS lookup failed");  
  29.             dns->deleteLater();  
  30.             return;  
  31.         }  
  32.         foreach (const QDnsHostAddressRecord &record, dns->hostAddressRecords()) {  
  33.             qDebug()<<record.name();  
  34.             qDebug()<<record.value();  
  35.             qDebug()<<record.timeToLive();  
  36.         }  
  37.         dns->deleteLater();  
  38. }  


输出如下:

"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,

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多