一个简单的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命令可以查看
发表评论