linux-socket编程(四) tcp

1:tcp的11种状态:

                                                  linux-socket编程(四) tcp

上面的状态有10种,第11种是CLOSING,这个的产生条件是当服务器和客户端同时发送关闭请求,这时候不会产生FIN_WAIT状态而是会产生CLOSING状态。只有主动发送close的一端,才会有TIME_WAIT状态。

linux-socket编程(四) tcp

可以使用代码来查看状态。

服务器:客户端的端口是53372

linux-socket编程(四) tcp

客户端:服务器的端口是6666

linux-socket编程(四) tcp

查看tcp:

linux-socket编程(四) tcp

看不到SYN_SEND和SYN_RCVD的原因是这个所需时间太短。

查看其它状态:

首先查看服务器进程pid:

linux-socket编程(四) tcp

然后关闭该服务器进程:

linux-socket编程(四) tcp

查看当前服务器的tcp状态。

linux-socket编程(四) tcp

由上图可以看出客户端所处的状态是CLOSE_WAIT,服务器所处的状态是FIN_WAIT2.

然后有程序:如何使客户端进入CLOSE_WAIT后面的状态,在客户端输入字符回车:

linux-socket编程(四) tcp

linux-socket编程(四) tcp

查看当前状态:

linux-socket编程(四) tcp

对于客户端端来说,为什么可以在发送数据,是因为接收到FIN仅仅代表对方不再发送数据。当客户端向对方发送数据的时候,由于对方进程结束,导致对方会反馈RST段,当收到这个段之后,如果再调用write就会产生SIGPIPE信号,对于这个信号的处理我们通常忽略即可。