域名系统(DNS)
DNS 中的条目称为资源记录(RR)
- A 记录 把一个主机名映射成一个32位的IPv4 地址
- AAAA 称为“四A”,是映射到一个128位的IPv6
- PTR 称为“指针记录”的PTR记录把IP地址映射成主机名,对IPv4地址,32位地址的4个字节先反转顺序,每个字节都转换成各自的十进制ASCII,再添上in-addr.arpa,结果字符串用于PTR查询
- MX MX记录把一个主机指定作为给定主机的“邮件交换器” 当存在多个MX记录时,我们按照优先级顺序使用,值越小优先级越高
- CNAME 规范名字,它的常见用法是为了常用的服务指派CANME记录
c库代码
#include <netdb.h>
struct hostent * gethostbyname(const char *hostname); // 把主机名映射成IPv4地址
struct hostent {
char *h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
}
struct hostent * gethostbyaddr(const char *addr, socklen_t len, int family) // 把IPv4地址转换为主机名
// 根据服务名字查询端口
struct servent {
char *s_name,
char **s_aliases,
int s_port,
char *s_proto
}
struct servent * getservbyname(const char *servname, const char *protoname);
struct servent * getservbyport(int port, const char * protoname);
// ipv6 的地址
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
char *ai_canonname;
struct sockaddr * ai_addr;
struct addrinfo *ai_next;
}
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo, **result);
int getnameinfo(const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags)
const char * gai_strerror(int error); // 解析getaddrinfo的错误返回码
void freeaddrinfo(struct addrinfo *al); // getaddrinfo返回的addrinfo 都是动态返回的
LINUX 系统主机
文件/etc/resolv.conf通常包含本地名字服务器主机的IP地址
不可重入函数
gethostbyname
gethostbyaddr
getservbyname
getservbyport
// 上述4个函数不可重入,它们都返回指向同一个静态结构的指针
// 为了支持4个函数的可重入版本,名字都是以_r结尾
inet_pton
inet_ntop
// 是可重入的
inet_ntoa // 不可重入
函数图文结构
信息 | 数据文件 | 结构 | 键值查找函数 | |
---|---|---|---|---|
主机 | /etc/hosts/ |
hostent | gethostbyaddr、gethostbyname | |
网络 | /etc/networks |
netent | getnetbyaddr、getnetbyname | |
协议 | /etc/protocols |
protoent | getprotobyname、getprotobynumber | |
服务 | /etc/services |
servent | getservbyname、getservbyport |