- 域名系统:提供主机名与IP地址之间的映射;主机名可以是个简单的名字(如:BSDI)也可以是一个完全限定名(Fully Qualified Domain Name)
- DNS中的每个条目成为一个资源记录(resource record,RR),其中RR有各种类型(参见域名系统);
- 对于即支持IPV4又支持IPV6的主机名的命名约定/??
- 解析器(通常以函数库的形式提供,客户通过函数调用与之交互)与名字服务器的交互(Name server)
- 当然最有可能是先与本地的名字服务器先交互(local name server),解析器代码通过读取系统配置文件(/etc/resolv.conf)确定本地名字服务器的IP地址,如果本地名字服务器无法解析一个名字,那么由本地服务器通过UDP向其他名字服务器查询;如果respones超过来UDP消息的承载能力,则本地名字服务器和解析器会切换到TCP.
- 不使用DNS:当然我们可以通过其他的方法来做名字与IP地址的映射,如静态主机文件(/etc/hosts)、网络信息系统(NIS)、轻权目录访问协议(LDAP)等,这些不同类型的名字服务可同过/etc/nsswitch.conf配置
- gethostbyname与gethostbyaddr:more detail on man page!
- gethostbyname只能做A类记录查询,只能返回IPV4?
- gethostbyaddr做与gethostbyname相反的工作
- 接下来讨论了getservbyname与getservbyport两个函数;当调用getservbyname时若未指定协议参数则返回的端口号取决与实现;
- 用gethostbyname与getservbyname重写了tcp获取时间程序
- hostent结构:
- getaddrinfo函数:即处理名字到地址的转换又处理服务到端口的转换,并且支持IPV4与IPV6,and是可重入的函数;返回的是一个addrinfo结构的链表;
- getaddrinfo返回的addrinfo结构的个数取决与指定的协议类型、套接字类型、服务三者
- 若在hint参数的ai_flags字段 指定AI_CANONNAME那么只在第一个addrinfo结构的ai_cannonname成员返回主机official name
- 函数出错:gai_strerror返回human readable message
- 由getaddrinfo函数返回的res结果集合都是动态分配内存的,通过freeaddrinfo函数进行释放;
- 接下来使用getaddrinfo函数改写封装来前面的几个函数,UDP客户端(core: udp_client、udp_connect分别为不连接UDP与连接UDP)、UDP服务器(udp_server)、TCP客户端(tcp_connect)、TCP服务器(tcp_listen); 这些函数中,用到来一个技巧来指定特定的协议类型; 即ai_family=AF_UNSPEC时,getaddrinfo会自动根据所给的主机IP类型来判断所使用的地址协议类型;
- getnameinfo函数做的与getaddrinfo函数相反,但是根据getnameinfo的参数,可知:getnameinfo无法确定使用的协议(TCP或UDP)<因为套接字地址结构仅仅提供了IP地址与端口>如果我们知道处理的是数据报套接字时,应该令flags=NI_DGRAM;
- 接下来讨论了函数的可重入性问题:gethostbyname、gethostbyaddr不可重入的原因在于它们共用一个静态结构static struct hostent host;
- 与网络相关的四类信息:主机、网络、协议、服务;所有四类信息都可以存在在各自的一个文件中,并为每类信息定义来各自的结构,及访问函数:getXXXent、setXXXent、endXXXent;
- 可以调用更加底层的解析器函数来完成我们的工作! man resolver