1. 程式人生 > >網路程式設計域名解析函式gethostbyname()的使用

網路程式設計域名解析函式gethostbyname()的使用

     我們通常在網頁上訪問一個網址,例如訪問百度時,我們通常是輸入www.baidu.com,這種表示是代表百度的域名,實際上當我們在訪問這個網址的時候,作業系統會自動向DNS伺服器傳送請求,來獲取百度的ip,完成域名到ip的轉換。在計算機網路中,通常我們我們在訪問一個網址時,輸入的是該網址的域名,而不是ip,因為像百度這種網址的ip通常是公有ip,這種ip是會變的,我們當然不會去記它會變的ip,而通過訪問域名的方法來訪問百度就會更方便,因為域名是不會變的。
     C中提供一個函式gethostbyname()來實現域名到ip的轉換:

標頭檔案#include<netdb.h>
函式原型struct hostent *gethostbyname(const char *name);
函式呼叫失敗返回NULL;
結構體hostnet定義


struct hostent {
char h_name; / official name of host */
char *h_aliases; / alias list /
int h_addrtype; /
host address type /
int h_length; /
length of address */
char *h_addr_list; / list of addresses */
}
hostent->h_name
表示的是主機的規範名。例如www.google.com的規範名其實是www.l.google.com

hostent->h_aliases
表示的是主機的別名.www.google.com就是google他自己的別名。有的時候,有的主機可能有好幾個別名,這些,其實都是為了易於使用者記憶而為自己的網站多取的名字。

hostent->h_addrtype    
表示的是主機ip地址的型別,到底是ipv4(AF_INET),還是pv6(AF_INET6)

hostent->h_length      
表示的是主機ip地址的長度

hostent->h_addr_list
表示的是主機的ip地址,注意,這個是以網路位元組序儲存的。千萬不要直接用printf帶%s引數來打這個東西,會有問題的哇。所以到真正需要打印出這個IP的話,需要呼叫inet_ntop()。

另外網路程式設計常用的一個函式:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
這個函式,是將型別為af的網路地址結構src,轉換成主機序的字串形式,存放在長度為cnt的字串中。返回指向dst的一個指標。如果函式呼叫錯誤,返回值是NULL。

接下來通過程式碼來驗證
:程式設計環境Ubuntu14.04下vim
(使用命令列引數來執行)
在這裡插入圖片描述

在這裡插入圖片描述
接下來編譯
在這裡插入圖片描述