前言
这一周又是忙着去考试了,学习也变得短短续续,好在至少没有拉下太多,但是博客的更新就推迟了。空闲的时候读了不少别人的博客,感觉自己的博客需要改进的地方有太多太多了。先把拉下的内容补上,然后好好想想博客该怎么写。
第十二章:IPV4与IPV6的互操作性
这一部分主要讲述的问题是当ipv4的主机或者客户遇上了ipv6的时候会怎样。
ipv6作为服务器:如果他同时有一个A地址和AAAA地址,那么ipv4 的客户端可以连接上其A地址,然后发送IPV4 的数据报,当IPV6服务器accept这个客户时,内核识别其为ipv4,然后自动映射为等价的IPV6地址。当服务器往ipv4客户发送数据时,内核将会自动以ipv4数据报来传输数据,因此,整个过程将会是以ipv4数据报来通信。
ipv4作为服务器:IPV6的客户如果运行在双栈主机上可以与ipv4服务器通信。ipv6客户端调用getaddrinfo时,在hints中设置了AI_V4MAPPED标志之后,将会返回一个ipv4映射成ipv6的地址。然后在ipv6客户调用connect的时候,内核检测到此ipv6地址实际上是ipv4映射而成,因此会发送一个ipv4的SYN给ipv4 的服务器。(或者调用sendto,同样自动使用ipv4的数据报)。
但是作为ipv4 的客户,是不能使用ipv6的地址的,所以说这个ipv4与ipv6通信的过程只需要理解成ipv6的客户端或者服务器迁就ipv4对端,使用映射的ipv4地址,ipv4数据报与之通信。
两个服务器的运行结果是完全互不干扰。。连SO_REUSEADDR都不用设置了。
第十三章:守护进程和inetd超级服务器
这一章首先编写了一个daemon_init函数,调用fork然后结束父进程,子进程调用setsid()变成自己为父进程,此时已经脱离了终端的控制,运行在后台中了。再次fork(之前忽略SIGHUP信号),留下子进程,结束父进程。此时该进程也不是会话头进程了。不能获得控制终端。基本上就完成了变成守护进程的工作了。
我照着图13-5的代码写了新的调用daemon_init函数的daytimeserv2程序,然后运行,结果就没有然后拉,使用ps aux查看所有进程也找不到这个进程了。反正就是运行失败了。也没能找到原因。暂时就不折腾了。。。之后的inetd守护进程控制。也因为我使用的CentOS7已经不用这个了。所以没法编写了。。
十三章的学习很失败。。