域名系統(Domain Name System, DNS)主要用於主機名和IP地址之間的映射,數據庫
是一個分佈式數據庫,可以令人更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP數串。服務器
主機名既但是一個簡單名字(如solaris),也但是一個全限定域名FQDN(如solaris.unpbook.com)。網絡
每一個組織機構每每運行一個或多個名字服務器(name server),客戶和服務器等應用程序經過調用解析器(resolver)函數庫中的函數接觸DNS服務器。分佈式
常見的解析函數gethostbyname()和gethostbyaddr(),前者把主機名映射成IPv4地址,後者執行相反映射。函數
解析器代碼一般包含在一個系統函數庫中,在構造應用程序時被鏈編(link-editing)到應用程序中。spa
另有些系統提供一個由全體應用進程共享的集中式解析器守護進程,並提供向這個守護進程執行RPC的系統函數庫代碼。3d
不論哪一種狀況,應用程序代碼使用一般的函數調用來執行解析器中的代碼。指針
解析器代碼經過讀取其系統相關配置文件肯定本組織機構的名字服務器們的所在位置。code
文件/etc/resolv.conf一般包含本地名字服務器主機的IP地址。server
解析器是UDP向本地名字服務器發出查詢。
若本地名字服務器不知道答案,它一般就使用UDP在整個Internet上查詢其餘名字服務器;
若答案太長,超出了UDP消息的承載能力,本地名字服務器和解析器會自動切換到TCP。
不使用DNS也可能獲取名字和地址信息。
經常使用的方法有靜態主機(一般是/etc/hosts文件)、網絡信息系統NIS以及輕權目錄訪問協議LDAP。
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname); // 執行的是對A記錄的查詢,只能返回IPv4地址。
gethostbyname()是查找主機名最基本的函數,返回對應於給定主機名的包含主機名字和地址信息的hostent結構指針。
出錯則爲NULL,且設置h_errno(HOST_NOT_FOUND、TRY_AGAIN、NO_RECOVERY、NO_DATA)。
struct hostent
{
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
};
假設查詢的主機名有兩個別名和3個IPv4地址,在這些字段中所查詢的主機的正式主機名和全部別名都是以空字符結尾的C字符串。
#include <netdb.h>
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family); // 成功則爲非空指針,出錯則爲NULL且設置h_errno。
addr參數實際不是char *類型,而是一個指向存放IPv4地址的某個in_addr結構的指針;
len參數是這個結構的大小,對於IPv4來講爲4;
family參數爲AF_INET。
gethostbyaddr在in_addr.arpa域中向一個名字服務器查詢PTR記錄。