您好,登錄后才能下訂單哦!
客戶端中直接運用IP地址會有很大的弊病,一旦IP地址變更(IP地址會常常變化),客戶端軟件就會呈現毛病。
而運用域名會便利許多,注冊后的域名只需每年續費就永遠屬于本人的,改換IP地址時修正域名解析即可,不會影響軟件的正常運用。
關于域名注冊、域名解析、host 文件、DNS 效勞器等本節并未具體解說,請讀者自行腦補。本節重點解說若何運用域名。
域名僅僅是IP地址的一個助記符,目標是便利記憶,經過域名并不克不及找到目的盤算機,通訊之前必需要將域名轉換成IP地址。
gethostbyname() 函數可以完成這種轉換,它的原型為:
struct hostent *gethostbyname(const char *hostname);
hostname 為主機名,也就是域名。運用該函數時,只需傳遞域名字符串,就會前往域名對應的IP地址。前往的地址信息會裝入 hostent 構造體,該構造體的界說如下:
struct hostent{ char *h_name; //official name char **h_aliases; //alias list int h_addrtype; //host address type int h_length; //address lenght char **h_addr_list; //address list }
從該構造體可以看出,不只前往IP地址,還會附帶其他信息,列位讀者只需存眷最初一個成員 h_addr_list。下面是對各成員的闡明:
h_name:官方域名(Official domain name)。官方域名代表某一主頁,但實踐上一些有名公司的域名并未用官方域名注冊。
h_aliases:別號,可以經過多個域名拜訪統一主機。統一IP地址可以綁定多個域名,因而除了以后域名還可以指定其他域名。
h_addrtype:gethostbyname() 不只支撐 IPv4,還支撐 IPv6,可以經過此成員獲取IP地址的地址族(地址類型)信息,IPv4 對應 AF_INET,IPv6 對應 AF_INET6。
h_length:保管IP地址長度。IPv4 的長度為4個字節,IPv6 的長度為16個字節。
h_addr_list:這是最主要的成員。經過該成員以整數方式保管域名對應的IP地址。關于用戶較多的效勞器,能夠會分派多個IP地址給統一域名,應用多個效勞器停止平衡負載。
hostent 構造體變量的構成如下圖所示:
下面的代碼次要演示 gethostbyname() 的使用,并闡明 hostent 構造體的特征:
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") int main(){ WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData); struct hostent *host = gethostbyname("www.baidu.com"); if(!host){ puts("Get IP address error!"); system("pause"); exit(0); } //別號 for(int 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"); //IP地址 for(int 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] ) ); } system("pause"); return 0; }
運轉后果:
Aliases 1: www.baidu.com
Address type: AF_INET
IP addr 1: 61.135.169.121
IP addr 2: 61.135.169.125
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。