CS模型之服务器进程终止

来源:互联网 发布:医学大数据分析工资 编辑:程序博客网 时间:2024/06/05 20:36

现在我们启动我们的客户/服务器,然后杀死服务器子进程。这是在模拟服务器进程崩溃的情况,我们可从中查看客户将发生什么。
(1)启动服务器和客户端,正常回射。
这里写图片描述

这里写图片描述

这里写图片描述
(2)找到服务器子进程ID,并kill杀死它。子进程中所有打开的描述符都被关闭。这导致向客户发送FIN,而客户TCP则相应ACK。这就是TCP连接终止工作的前半部分。
(3)SUGCHLD信号被发送给服务器父进程,并得到正确处理。
(4)客户上并没有发生任何特殊之事。客户TCP接收服务器TCP的FIN并相应一个ACK,然而问题是客户进程阻塞在fgets调用上。
这里写图片描述

(5)我们再键入一行,str_cli调用writen,客户TCP接着把数据发给服务器,TCP允许这么做,因为客户收到FIN只是表示服务器进程已关闭了连接的服务器端,从而不再往其中发送任何数据而已。
(6)当服务器端接收到TCP客户数据时,相应RST。
(7)然而客户进程看不到RST,因为它在调用writen后立即调用readline,并且收到(2)的FIN,readline返回0。
(8)客户端关闭时,所有打开的描述符关闭
这里写图片描述

这里写图片描述

问题

当FIN到达套接字时,客户正阻塞在fgets调用上,客户实际在应对两个描述符,套接字和用户输入,它不能单纯阻塞在这两个源中的某个特定源上。接下来讲解select和poll可以解决这个问题。

原创粉丝点击