Unix网络编程-TCP客户端服务器示例(2)

一个简单的TCP客户端/服务器程序示例,这个简单的例子执行如下步骤的一个回射服务器:

1) 客户端从标准输入读入一行文本,并写给服务端

2) 服务端从网络输入读入一行文本,并回射给客户端

3) 客户端从网络输入读入这行回射的文件,并显示在标准输出上。

下图描述了这个简单的客户/服务器:

代码略,见上篇。

服务器进程终止

现在启动我们的客户/服务器对,然后杀手服务器子进程。这是在模拟服务器进程崩溃的情况,我们可以从查看客户将发生什么。

所发生的步骤如下所述。

1) 我们在同一台主机上启动服务器和客户,并在客户上键入一行文本,以验证一切正常。正常情况下该行文本由服务器子进程回射给客户。

2) 找到服务器子进程的进程ID,并执行kill命令杀死他。作为进程终止处理的部分工作,子进程中所有打开着的描述符都被关闭。这就导致向客户发送一个FIN,而客户TCP则响应以一个ACK。这就是TCP连接终止的前半部分。我们用tcpdump程序查看到的数据包


第一行服务端发送的FIN数据包,第二行客户端发给的ACK。

3) 客户上没有发生任何特殊之事,客户TCP接收来自服务器TCP的FIN并响应一个ACK。然而问题是客户进程阻止在fgets调用上,等待从终端接收一行文本。

4) 此时,在另一个窗口上运行netstat命令,观察套接字状态。

很快截图

等了一会截图

5) 我们可以在客户上再键入一行文本。客户TCP接着把数据发送给服务器,TCP允许这么做,因为客户TCP接收到FIN只是表示服务进程已经关闭了连接的服务端,从而不再发送数据给客户端而已,FIN的接收并没有告知客户TCP服务器进程已经终止。当服务器接收到来自客户的数据时,既然套接字进程已经终止,于是响应一个RST,通过tcpdump来观察分组

6) 然而客户进程看不到这个RST,因为他再调用write后立即调用了read,并且由于接收到FIN,所以read立即返回0.

你可能感兴趣的:(Unix网络编程-TCP客户端服务器示例(2))