第三部分 高级套接字编程 ipv4与ipv6的互操作性, 守护进程编写出错,暂时未解决。

前言

这一周又是忙着去考试了,学习也变得短短续续,好在至少没有拉下太多,但是博客的更新就推迟了。空闲的时候读了不少别人的博客,感觉自己的博客需要改进的地方有太多太多了。先把拉下的内容补上,然后好好想想博客该怎么写。

第十二章: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数据报与之通信。

本章习题:本章的习题12.2没有答案,习题的内容是尝试在同一个端口先后运行两个服务器程序,分别绑定ipv4的通用地址和ipv6的通用地址。观察是否能够运行。
在编写ipv4服务器的时候没有遇到任何问题。绑定通用地址使用的htonl(INADDR_ANY),然后赋值给servaddr.sin_addr.s_addr。
然而在绑定ipv6的通用地址的时候我可就发愁了,ipv6的通用地址可怎么绑定,书上好像没有给出来。上网查了查,发现是IN6ADDR_ANY_INIT。但是用什么转换函数??不知道。书上绑定ipv6使用的是getaddrinfo,设置hints的ai_flags为AI_PASSIVE,然后传入一个0::0进行绑定。我查看了getaddrinfo的各个参数对应的处理表,发现此时实际上是调用的inet_pton函数。然后使用此函数传入0::0完成了绑定。

两个服务器的运行结果是完全互不干扰。。连SO_REUSEADDR都不用设置了。

第十三章:守护进程和inetd超级服务器

这一章首先编写了一个daemon_init函数,调用fork然后结束父进程,子进程调用setsid()变成自己为父进程,此时已经脱离了终端的控制,运行在后台中了。再次fork(之前忽略SIGHUP信号),留下子进程,结束父进程。此时该进程也不是会话头进程了。不能获得控制终端。基本上就完成了变成守护进程的工作了。

我照着图13-5的代码写了新的调用daemon_init函数的daytimeserv2程序,然后运行,结果就没有然后拉,使用ps aux查看所有进程也找不到这个进程了。反正就是运行失败了。也没能找到原因。暂时就不折腾了。。。之后的inetd守护进程控制。也因为我使用的CentOS7已经不用这个了。所以没法编写了。。委屈

十三章的学习很失败。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值