linux 域名解析的原理:
1、 查找本地中的配置文件
配置文件/etc/hosts
域名服务器地址文件:/etc/resolv.conf文件
2. 通过发送DNS解析请求给DNS服务器,返回应答
相关结构为:
struct hostent {
char *h_name; //主机名
char **h_aliases; //别名
int h_addrtype; //host address type
int h_length; //地址长度
char **h_addr_list; //ipv4地址
};
相关函数:
gethostbyname
注意点:当错误发生时,不设置errno变量,而是将全局整数变量h_errno设置为定义在<netdb.h>中的下列常值之一:
HOST_NOT_FOUND;
TRY_AGAIN;
NO_RECOVERY;
NO_DATA(eqNO_ADDRESS)
gethostbyaddr:
与gethostbyname相反,由二进制的IP地址找到对应的主机名。
获取主机上的服务名:
getservbyname
getservbyport
注意点:得到的主机地址和端口号为网络字节序,需要转换为主机字节序。
getaddrinfo //适用于ipv6和ipv4, 其用于替代gethostbyname及getservbyname
获取的地址结构为struct addrinfo
注意点:getaddrinfo获取的空间是动态获取的,这些存储空间通过调用freeaddrinfo返还给系统。
gai_strerror可以获取由getaddrinfo的返回值的名字和含义。
获取服务;
struct addrinfo*host_serv
getaddrinfo的互补函数:getnameinfo
编程中推荐使用可重入函数:
gethostbyname_r
gethostbyaddr_r