網域名稱系統dns(domain name system )
ip位址是難以記憶與表述的,所以使用網域名稱取代ip位址
網域名稱是賦予伺服器的虛擬位址,dns伺服器負責將虛擬位址(網域名稱)轉化為實際位址(ip位址)
所有計算機中都記錄著預設dns伺服器位址,通過預設的dns伺服器獲得網域名稱的相應ip位址資訊,預設dns伺服器不可能知道所有的網域名稱的ip位址,當預設dns收到無法解析的請求時,會向上級dns伺服器詢問,若上級dns也無法解析則重複剛才的動作逐級向上詢問,直到頂級dns伺服器,也就是根dns伺服器,它知道向哪乙個dns伺服器詢問。。。解析好網域名稱後原路返回並將ip位址傳遞給發起請求的主機
為什麼使用網域名稱
網域名稱一旦被註冊永久不變,而ip位址的變更概率卻比較高,因此應該使用網域名稱編寫程式,應該根據網域名稱獲取位址,再接入伺服器
利用網域名稱獲取ip位址
struct hostent *gethostbyname(const char*name);
函式成功時返回hostent結構體位址,失敗返回null指標
使用時僅需傳入網域名稱字串,返回的位址資訊再結構體中
hostent結構體定義:
struct hostent ;
示例**:
int i = 0;
struct hostent *host = null;
......
host = gethostbyname(argv[1]);
if(!host)
printf("official name : %s\n", host->h_name);
for(i=0; host->h_aliases[i]; i++)
printf("aliases %d: %s\n", i + 1, host->h_aliases[i]);
printf("address type: %s\n", (host->h_addrtype == af_inet)? "af_inet" : "af_inet6");
for(i=0; host->h_addr_list[i]; i++)
printf("ip addr %d : %s\n", i + 1, inet_ntoa(*(struct in_addr)host->h_addr_list[i]))
hostent結構體成員h_addr_list指向的陣列型別並不是in_addr結構體的指標陣列,而是char指標,因為此結構體不是只為ipv4準備,同時也因為當時還沒有定義標準化void指標,所以採用了char指標
利用ip位址獲取網域名稱
struct hostent * gethostbyaddr(const char *addr, socklen_t len, int family);
成功時返回hostent結構體變數的位址,失敗時返回null指標
引數一: 傳含有ip位址資訊的in_addr結構體位址
引數二: 向第乙個引數傳遞的位址資訊位元組數ipv4為4,ipv6為16
引數三: 傳遞位址族資訊ipv4時為af_inet,ipv6時為af_inet6
IP位址與網域名稱
區別與關係 ip位址與網域名稱是一對多的關係。乙個ip位址可以對應多個網域名稱,但是乙個網域名稱只有乙個ip位址。ip位址是數字組成的,不方便記憶,所以有了網域名稱,通過網域名稱位址就能找到ip位址。格式例如 url是網頁位址 例如1 是url zhidao.baidu.com就是網域名稱 220....
IP位址與網域名稱
在現實生活中,如果要打 則需要知道對應人的 號碼,如果要寄信則需要知道收信人的位址。在網路中也是這樣,需要知道乙個裝置的位置,則需要使用該裝置的ip位址,具體的連線過程由硬體實現,程式設計師不需要過多的關心。ip位址是乙個規定,現在使用的是ipv4,既由4個0 255之間的數字組成,在計算機內部儲存...
IP位址與網域名稱聯絡
馮諾依曼體系結構 輸入裝置 儲存器 cpu 控制器 運算器 輸出裝置 網域名稱 英語 domain name 又稱網域,是由一串用點分隔的名字組成的internet上某一台計算機或計算機組的名稱,用於在資料傳輸時對計算機的定位標識 有時也指地理位置 由於ip位址具有不方便記憶並且不能顯示位址組織的名...