域名查詢系統
什麼是域名
在 Internet 上有千百萬臺主機,爲了區分這些主機,每一臺主機都被分配一個 IP 地址。但由於 IP 地址沒有實際意義且難於記憶,於是就有了域名(Domain Name)。
域名主要是由英文字母、阿拉伯數字、“ - ” 、“ . ” 等組成,目的是爲了方便記憶和溝通一組服務器的地址(網站、電子郵件、FTP 等)。
域名和 IP 是相互對應的,在 Internet 上專門有 DNS(域名服務器)來進行域名與 IP 的相互轉換,您在瀏覽器上輸入域名, DNS 會進行域名與 IP 的轉換,才能找到相應的服務器,打開相應的網頁。
示例的功能
根據輸入的域名查詢IP,由於源代碼是使用命令行運行的,有點不方便,所以稍微修改了一下,下面是效果圖
代碼分析
本利中使用到的類有
QDNSLookup
類可以查詢的信息有如下幾種,
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記錄,一般指爲某個主機名或域名設置的說明, |
-
QDnsDomainNameRecord
存儲關於域名記錄的信息,在執行名稱服務器查找時,將返回零條或多條記錄。
// CNAME records foreach (const QDnsDomainNameRecord &record, dns->canonicalNameRecords()) ret = QString("%1\t%2\tIN\tCNAME\t%3\n") .arg(record.name()) .arg(record.timeToLive()) .arg(record.value()); // NS records foreach (const QDnsDomainNameRecord &record, dns->nameServerRecords()) ret = QString("%1\t%2\tIN\tNS\t%3\n") .arg(record.name()) .arg(record.timeToLive()) .arg(record.value()); // PTR records foreach (const QDnsDomainNameRecord &record, dns->pointerRecords()) ret = QString("%1\t%2\tIN\tPTR\t%3\n") .arg(record.name()) .arg(record.timeToLive()) .arg(record.value());
函數 作用 name() 返回此記錄的名稱 timeToLive() 返回此記錄有效的持續時間(以秒爲單位) value() 返回此域名記錄的值 -
QDnsHostAddressRecord
類存儲有關主機地址記錄的信息,執行地址查找時,將返回零條或多條記錄。
// A and AAAA records foreach (const QDnsHostAddressRecord &record, dns->hostAddressRecords()) { const char *type = (record.value().protocol() == QAbstractSocket::IPv6Protocol) ? "AAAA" : "A"; ret = QString("%1\t%2\tIN\t%3\t%4\n") .arg(record.name()) .arg(record.timeToLive()) .arg(type) .arg(record.value().toString()); }
函數 作用 name() 返回此記錄的名稱 timeToLive() 返回此記錄有效的持續時間(以秒爲單位) value() 返回此主機地址記錄的值 -
QDnsServiceRecord
類存儲關於DNS SRV記錄的信息。在對服務執行查找時,將返回零條或多條記錄
// SRV records foreach (const QDnsServiceRecord &record, dns->serviceRecords()) ret = QString("%1\t%2\tIN\tSRV\t%3 %4 %5 %6\n") .arg(record.name()) .arg(record.timeToLive()) .arg(record.priority()) .arg(record.weight()) .arg(record.port()) .arg((record.target()));
函數 作用 name() 返回此記錄的名稱 port() 返回此服務記錄在目標主機上的端口 priority() 返回此服務記錄的優先級。客戶端必須嘗試以編號最低的優先級與目標主機聯繫 target() 返回此服務記錄的目標主機的域名。 timeToLive() 返回此記錄有效的持續時間(以秒爲單位)。 weight() 返回此服務記錄的權重。weight字段爲具有相同優先級的條目指定一個相對權重。具有較高權重的條目應該選擇具有較高概率的條目 -
QDnsMailExchangeRecord
類存儲關於DNS MX記錄的信息,在對服務執行查找時,將返回零條或多條記錄
// MX records foreach (const QDnsMailExchangeRecord &record, dns->mailExchangeRecords()) ret = QString("%1\t%2\tIN\tMX\t%3 %4\n") .arg(record.name()) .arg(record.timeToLive()) .arg(record.preference()) .arg(record.exchange());
函數 作用 exchange 返回此記錄的郵件交換的域名。 name 返回此記錄的名稱。 preference 返回此記錄的首選項。 timeToLive 返回此記錄有效的持續時間(以秒爲單位)。 -
QDnsTextRecord
類存儲關於DNS TXT記錄的信息,執行文本查找時,將返回零條或多條記錄
// TXT records foreach (const QDnsTextRecord &record, dns->textRecords()) { QStringList values; foreach (const QByteArray &ba, record.values()) values << "\"" + QString::fromLatin1(ba) + "\""; ret = QString("%s\t%i\tIN\tTXT\t%s\n") .arg(record.name()) .arg(record.timeToLive()) .arg(values.join(' ')); }
函數 作用 name 返回此記錄的名稱。 timeToLive 返回此記錄有效的持續時間(以秒爲單位)。 value() 返回此主機地址記錄的值
如何查詢DNS
QDnsLookup使用操作系統提供的機制來查找DNS。在進行查找時,需要指定名稱和類型,然後調用l該類的ookup()函數。在完成後將該類會發出finished()信號。
如何查詢DNS
QDnsLookup使用操作系統提供的機制來查找DNS。在進行查找時,需要指定名稱和類型,然後調用l該類的ookup()函數。在完成後將該類會發出finished()信號。