在socket中運用域名

客戶端中直接運用IP地址會有很大的弊病,一旦IP地址變更(IP地址會常常變化),客戶端軟件就會呈現毛病。
而運用域名會便利許多,註冊後的域名只需每年續費就永遠屬於本人的,改換IP地址時修正域名解析即可,不會影響軟件的正常運用。
關於域名註冊、域名解析、host 文件、DNS 效勞器等本節並未具體解說,請讀者自行腦補。本節重點解說若何運用域名。

經過域名獲取IP地址

域名僅僅是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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章