1. DNS服務器
DNS(Domain Name System):是對IP地址和域名(如:www.baidu.com等)進行相互轉(zhuǎn)換的系統(tǒng),其核心是DNS服務器。
我們輸入的www.baidu.com是域名,是一種虛擬地址,而非實際地址,DNS服務器會將這個虛擬地址轉(zhuǎn)換為實際地址,即IP地址。若我們直接輸入IP地址,則不會發(fā)生上面的轉(zhuǎn)換。
如果想獲取某個域名對應的IP地址,則可以cmd輸入:ping www.baidu.com
如果想獲取本機注冊的默認的DNS服務器地址,則可以cmd輸入:nslookup(windows)、nslookup server(linux)
所有計算機都記錄著默認DNS服務器地址,通過這個DNS服務器就能得到相應域名的IP地址信息,如果本機的默認DNS服務器解析不了這個域名,那么就會逐級往上詢問,直到根DNS服務器,它直到應該向哪個DNS服務器詢問,再向下級DNS專遞解析請求,得到IP地址后,返回給發(fā)起請求的主機。所以,DNS就是一種層次化管理的分布式數(shù)據(jù)庫系統(tǒng)。
2. IP地址和域名之間的轉(zhuǎn)換
IP地址和域名之間的關(guān)系:一個IP地址可以對應多個域名,一個域名也可以對應多個IP地址。
通常來說,域名是不會變化的,但是IP地址是可以隨時變化的,因為服務器會變化,尤其是像那種有多個服務器進行負載均衡的,就有多個IP地址,所以,我們在編寫程序時,要通過用戶輸入的域名來解析獲取IP地址。
2.1 gethostbyname函數(shù)(利用域名獲取IP地址)
#include <netdb.h>
struct hostnet* gethostbyname(const char* hostname);
成功返回hostnet結(jié)構(gòu)體,失敗返回Null指針
struct hostent
{
char* h_name;
char** h_aliases;
int h_addrtype;
int h_length;
char** h_addr_list;
}
參數(shù) | 含義 |
h_name | 存有官方域名。官方域名代表某一主頁,不是所有公司都有 |
h_aliases | 其它可以訪問這個域名所指向主頁的域名。同一個IP可以綁定多個域名。 |
h_addrtype | 地址族信息,若是IPv4則是AF_INET,IPv6則是AF_INET6 |
h_length | 保存IP地址字節(jié)長度。IPV4則是4,IPV6則是16 |
h_addr_list | 以整數(shù)形式保存域名對應的IP地址,每個數(shù)組實際上是以in_addr結(jié)構(gòu)體存儲的。 所以在使用時,要進行強制轉(zhuǎn)換為in_addr* 類型 |
hostent參數(shù)結(jié)構(gòu):
h_addr_list數(shù)組實際上是以in_addr結(jié)構(gòu)體存儲的,為什么不直接以in_addr數(shù)組存儲,而是以字符數(shù)組存儲?
答:是因為為了兼容IPv6地址信息,考慮到通用性,所以用字符數(shù)組存儲。
那為什么不用void*存儲?文章來源:http://www.zghlxwxcb.cn/news/detail-663605.html
答:是因為當時還沒有對void指針標準化,當時無法明確指出指針類型時采用的就是char指針。?文章來源地址http://www.zghlxwxcb.cn/news/detail-663605.html
2.2 gethostbyaddr函數(shù)(利用IP地址獲取域名)
#include<netdb.h>
struct hostent* gethostbyaddr(
const char* addr, //含有IP地址信息的in_addr結(jié)構(gòu)體指針,同時為了傳遞IPv4地址之外的其他信息,所以聲明為char指針
socklen_t len, //向第一個參數(shù)傳遞的地址信息字節(jié)數(shù),IPv4為4,IPv6為16
int family //地址族信息
);
到了這里,關(guān)于[C++ 網(wǎng)絡協(xié)議編程] 域名及網(wǎng)絡地址的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!