域名系统
何为域名
提供网络服务的服务器端也是通过IP地址区分的,但几乎不可能以非常难记的IP地址形式交换服务器端地址信息。因此,将容易记的,易于表述的域名分配并取代IP地址。
DNS服务器
DNS服务器实际上就是用来解析域名的,把域名的对应的IP地址找出来,返回给客户端。
默认DNS服务器收到自己无法解析的请求时,向上级DNS服务器询问。通过这种方式逐级向上传递信息,到达顶级服务器——根DNS服务器时,它知道该向哪个DNS服务器询问。向下级DNS传递解析请求,得到IP地址后原路返回,最后将解析的IP地址传递到发起请求的主机。DNS就是这样层次化管理的一种分布式数据库系统。
程序中有必要使用域名么
IP地址比域名发生变更的概率要高,所以利用IP地址编写程序并非上策。利用域名来编写程序会好一些,根据域名获取IP地址,这样程序就不再依赖IP地址。
利用域名获取IP地址
#inclue <netdb.h>
struct hostent * gethostname(const char * hostname);
成功时返回hostent结构体地址,失败时返回NULL指针
这个函数使用方便。只要传递域名字符串,就会返回域名对应的IP地址。只是返回时,地址信息装入hostent结构体。此结构体定义如下
struct hostent
{
char * h_name; //official name
char ** h_aliases; //alias list
int h_addrtype; //host address type
int h_length; //address length
char ** h_addr_list; //address list
}
域名转IP时只需关注h_addr_list。
h_name
该变量中存有官方域名(Official domain name)官方域名代表某一主页,
但实际上,一些著名公司的域名并未用官方域名注册。
h_aliases
可以通过多个域名访问同一主页。同一IP可以绑定多个域名,
因此,除官方域名外还可以指定其他域名。这些信息可以通过h_aliases获得。
h_addrtype
gethostbyname函数不仅支持IPv4,还支持IPv6。
因此可以通过此变量获取保存在h_addr_list的IP地址的地址族信息。
若是Ipv4,则此变量存有AF_INET。
h_length
保存IP地址长度。若是IPv4地址,因为是4个字节,则保存4;IPv6时