unix网络编程卷2(unix网络编程和unix环境高级编程)

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

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

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

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

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

TCP回射服务器程序

TCP服务器回射函数

TCP客户端程序

TCP客户端回射函数

正常启动

首先我们在主机上启动服务端程序,服务器启动后,他调用socket、bind、listen、accept,并阻塞于accept调用。在客户端没有启动前,我们用netstat程序来检查服务端监听套接字的状态。

这个输出正是我们所期望的:有一个套接字处于LISTEN状态,他有通配的本地IP地址,本地端口为1024。

接着我们在同一主机上启动客户端,被指定服务器主机的IP地址为127.0.0.1(环回地址)。

客户端调用socket和connect,后者引起TCP的三路握手过程,当三路握手完成后,客户中的connect和服务器中accept均返回,于是建立连接。我们用tcpdump程序查看到的三路握手数据包

用netstat查看

上图中,第三行的ESTABLISHED对应服务端子进程的套接字,因为他的本地端口号为1024,第二行的ESTABLISHED对应客户端进程的套接字,因为他的本地套接字是55516。

正常终止

至此连接已经建立,不论我们在客户端输入什么,都会回射到他的标准输出中。

我们终止客户端,此时如果我们立即执行netstat命令,我们将看到如下结果

当前连接的客户端他的本地端口55518,进入了TIME_WAIT状态,而监听服务进程仍等待另一个客户来连接。我们用tcpdump程序查看四路挥手数据包如下

由于我们没有对服务端子进程处理,子进程将进入僵死状态,用ps命令可以查看