TCP的CLOSE_WAIT状态

1  在客户端主动关闭时,服务器端也要被动关闭(服务器端也要主动调用closesocket),如果服务器端不被动关闭,客户端就收不到服务器端发来的FIN,就一直在FIN_WAIT_2了,而此时服务器端只收到客户端发来的FIN(自己只向客户端发了ACK,没有向客户端发FIN),也一直停留在CLOSE_WAIT

 出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

解决方法
基本的思想就是要检测出对方已经关闭的socket,然后关闭它。

1.代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是AGAIN,也断开连接。(注:在UNP 7.5节的图7.6中,可以看到使用select能够检测出对方发送了FIN,再根据这条规则就可以处理CLOSE_WAIT的连接)
2.给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。
3.使用一个Heart-Beat线程,定期向socket发送指定格式的心跳数据包,如果接收到对方的RST报文,说明对方已经关闭了socket,那么我们也关闭这个socket。
4.设置SO_KEEPALIVE选项,并修改内核参数

参考

http://blog.chinaunix.net/u/12592/showart_2059174.html

你可能感兴趣的:(tcp,socket,服务器)