我遇到的这个问题有点奇葩,找了半天找不到原因,特来咨询一下大神
1、如题所说,是client端出现了close_wait,我的client端是linux系统。理论上在2小时后linux会自动检测这些连接,然后自动回收的,但是我发现并linux系统没有这么做。这是我想问的第一个问题,为什么linux不进行回收,难道当连接变成close_wait后还能进行数据通信?
2、我的java程序使用的PrintWriter进行数据发送,但是这个方法不会抛出异常。那么当连接进入close_wait后调用print或flush会发生什么?JavaLinuxTCP

解决方案 »

  1.   

    close_wait顾名思义是一种等待状态,其实它依然是打开的,轮到它的时候才会真正的关闭,那就是closed。
      

  2.   

    close_wait是一种半关闭状态。接收端已经关闭,发送端可以继续,如果对方已经关闭了socket,会将你发送的数据丢弃,但是仍然会发ACK,所以这一端的通信仍然是畅通的,keepAlive时发送的心跳还是成功的。
    一般收到对方的FIN后,就应该关闭这个socket了,以完成tcp连接的正常关闭。继续发送已经没意义了,除非本身是这样设计的。
      

  3.   

    CLOSE_WAIT基本上是由于server端没有正确关闭造成的,楼主看一下代码,CLOSE_WAIT状态最后应该是会被关闭的,但是需要比较长的时间(与服务器的设置有关),我以前总结过一下这方面的问题:http://blog.csdn.net/kittaaron/article/details/8308490
    楼主可以参考一下。有神马不对的地方也欢迎指正
      

  4.   


    我这个连接是长连接,除非检查到该连接通信异常,我才会去主动断开。现在是对方已经断开了,但是不知为何我这边的TCP连接却一直处于close_wait,却不释放,导致该连接坏死,任何使用这个连接的操作都失败。所以现在我希望是能检测到这种异常并主动断开连接,但是我的程序一直检测不到这个连接已坏
      

  5.   


    那这种情况应该怎么做?对方丢弃数据时,我这边如何能判断出?
    inputStream.read()==-1表明对方已经关闭,你也应该关闭socket了。