unix 网络编程 chap11

本文深入探讨了域名系统(DNS)如何将主机名映射为IP地址,解析过程涉及本地和远程名称服务器的交互,以及如何使用不同方法进行名称与IP地址的映射。详细解释了gethostbyname、gethostbyaddr、getaddrinfo等函数的功能和用法,同时介绍了网络相关的四类信息及其访问方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 域名系统:提供主机名与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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值