• 我们在前面几篇文章中一直关注主机名和IP地址以及服务名和端口号。然而我们的视野可以更广阔 些,应用进程可能想要查找四类与网络相关的信息:主机、网络、协议和服务。大多数查找针对的是主机(gethostbyname和gethostbyaddr),一小部分查找针对的是服务(getservbyname 和getservbyport),更小一部分查找针对的是网络和协议
  • 所有四类信息都可以存放在一个文件中,每类信息各定义有三个访问函数:
    • (1) 函数getXXXent读出文件中的下一个表项,必要的话首先打开文件
    • (2) 函数setXXXent打开(如果尚未打开的话)并回绕文件
    • (3) 函数endXXXent关闭文件
  • 每类信息都定义了各自的结构,包括hostent、netent、protoent和servent。这些定义 通过包含头文件提供

除了用于顺序处理文件的get、set和end这三个函数外,每类信息还提供一些键值查找 (keyed loopup)函数。这些函数顺序遍历整个文件(通过调用getXXXent函数读出每一行),但 是不把每一行都返回给调用者,而是寻找与某个参数匹配的一个表项。这些键值查找函数具有 形如getXXXbyYYY的名字。举例来说,针对主机信息的两个键值查找函数是gethostbyname(查 找匹配某个主机名的表项)和gethostbyaddr(查找匹配某个IP地址的表项)。下图汇总了 这些信息

UNP编程:34---名字与地址转换之(地址、服务解析函数总结)_地址、服务解析函数总结

  • 在使用DNS的前提下如何应用这些函数呢?首先,只有主机和网络信息可通过DNS获取, 协议和服务信息总是从相应的文件中读取。我们早先在前面文章中提到过,不同的实现 有不同的方法供系统管理员指定是使用DNS还是使用文件来查找主机和网络信息。
  • 其次,如果使用DNS查找主机和网络信息,那么只有键值查找函数才有意义。举例来说, 你不能使用gethostent并期待顺序遍历DNS中的所有表项。如果调用gethostent,那么它仅 仅读取/etc/hosts文件并避免访问DNS
  • 虽然网络信息可以做成通过DNS能够访问到,但是很少有人这么做。[Albitz and Liu 2001]讲述了这个特性。典型的做法反而是:系统管理员创建并维护一个/etc/networks文 件,网络信息通过它而不是通过DNS获取。如果存在这个文件,指定-i选项的netstat程序 就使用它显示每个网络的名字。然而无类寻址(A.4节)使得这些函数几近无用,而且它们又 不支持IPv6,因此新的网络应用应该避免使用网络名字