主机名字与IP地址之间的映射由DNS(域名系统,Domain Name System)完成。
DNS中的条目称为资源记录(resource record, RR),其中包括以下字段
A 记录一个主机名映射的32位IPv4地址。
AAAA 记录一个主机名映射的128位IPv6地址。
PTR 把IP地址映射成主机名。
对IPv4,32地址的4个字节先反转顺序,每个字节换成各自的十进制ASCII后,再添上in-addr.arpa
对IPv6,32个四位组先反转顺序,每个四位组转换成16进制的ASCII后,再添上ip6.arpa
MX 记录把一个主机指定作为给定主机的“邮件交换器”,可能有多个,有优先级改变,值越小优先级越高
CNAME canonical name(规范名字),为常用的指派CNAME记录。
不使用DNS也可能获取名字和地址信息,常用的替代方法有:
静态主机文件(通常是/etc/hosts,也可能是/etc/nsswitch.conf等)
网络信息系统(Network Information System, NIS)
轻权目录访问协议(Lightweight Director Access Protocol,LDAP)
1,gethostbyname&gethostbyaddr
这两个函数分别通过名字获取ip地址和通过ip地址过去主机名字。
函数原型(linux man page):
这两个函数返回一个hostent的结构如下(linux man page):
对于这两个函数,出错是不设置errno,而是将全局整数变量h_errno设置为以下常值(<netdb.h>)。
HOST_NOT_FOUND
TRY_AGAIN
NO_RECOVERY
NO_DATA(NO_ADDRESS)
函数 const char* hstrerror(int err)可以解析这些错误,返回错误说明。
2,getservbyname&getservbyport
像主机一样,服务也通常靠名字来认知,以上两个函数可以通过名字和服务的映射文件(通常是/etc/services)获取服务和名字。
3,getaddrinfo
这个函数可以处理名字及地址到服务和端口的转换。