第九、十章讲述SCTP协议及套接字编程, 第一次阅读暂时跳过。
第十一章讲述名字与地址转换
DNS
DNS,即域名系统,主要用于主机名字与IP地址之间的转换。DNS中的条目称为RR,资源记录resource record,一共有以下若干种:
1.
A A记录把一个主机名映射为一个32位的IPv4地址
2.
AAAA AAAA记录把一个主机名映射为一个128位的IPv6地址
3.
PTR 把IP地址转换成主机名。对于IPv4地址,32位地址的4个字节先反转顺序, 每个字节都转换成各自的十进制ASCII值,然后再加上in-addr.arpa,结果字符串用于PTR查询;对于IPv6地址,128位地址的32个4位组先反转顺序,每个四位组转换成十六进制ASCII值,然后再加上ip6.arpa
4.
MX 将右侧的主机指定成左侧给定主机的邮件交换器
5.
CNAME CNAME代表规范名字,为常用的服务指派CNAME记录
示例:
freebsd IN A 12.106.32.254
IN AAAA 3ffe:b80:1f8d:1:a00:20ff:fea7:686b
IN MX 5 freebsd.unpbook.com
IN MX 10 mailhost.unpbook.com
gethostbyname函数
gethostbyname函数返回主机名对应的IPv4地址
struct hostent *gethostbyname(const char *hostname);
//成功返回非NULL指针,失败返回NULL,同时设置h_errno
struct hostent{
char *h_name; //规范主机名
char **h_aliases; //别名
int h_addrtype; //主机地址类型:AF_INET4
int h_length; //地址字节长度:4
char **h_addr_list; //映射ip列表
};
gethostbyname出错不设置errno变量,而是设置全局变量h_errno,有strerror函数将h_errno变量作为唯一参数,返回const char *指针,指向相应错误说明。
gethostbyaddr函数
gethostbyaddr函数试图由一个二进制的IP地址得到相应的主机名
#include <netdb.h>
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
//成功返回非NULL指针,失败返回NULL,同时设置h_errno
这里addr是指向某个in_addr结构的指针;len对于IPv4为4;family为AF_INET
getservbyname和getservbyport函数
getservbyname根据给点名字查找相应服务。
#include <netdb.h>
struct servent *getservbyname(const char *hostname, const char *protoname);
//成功返回非空指针,失败返回NULL
struct servent{
char *s_name; //正式服务名
char **s_aliases; //服务别名
int s_port; //端口号(网络字节序)
char *s_proto; //协议名称
};
getservbyport根据给定端口号查找相应服务。
#include<netdb.h>
struct servent *getaddrbyport(int port, const char *protoname);
//成功返回非NULL指针,失败返回NULL
port参数必须是网络字节序。