最近用boost asio做tcp服务器和客户端,我看boost::asio 的chat 里面 handle_read有错误是也没有用close 关掉,不知道为什么服务器读的时候有错误还没有关掉。在我的程序里我也是client端退出时就送掉所有的连接,但是现在发出还有N多close_wait状态不知道错误在哪里,请大牛指导!

解决方案 »

  1.   

    估计是sever忘了关闭没用的socket
      

  2.   

    你问题的原因是因为在关闭socket的时候默认情况下系统会等待一段时间来保证最后数据的发送或接收全部完成。所以你要在关闭socket之前告诉系统:“我不需要你的等待,直接跟我马上关闭”。
    1:是调用Scoekt.close()之前调用 Socket.shutDown();
    2:设置socket的选项,把等待时间设置为0
      

  3.   

    close_wait状态表明你的服务器连接已经接收到客户端的断链请求,但是由于你的服务器的没有去close连接,所以处于等待关闭的状态。
    正确的做法在服务器端如果连接不需要,调用close关掉就可以。
    参考一下《tcp/ip协议详解》一书关于tcp状态的图就明白了。
      

  4.   

    可疑给服务器设置keepalive属性,自动检测客户端
      

  5.   

    keepalive 默任为两小时,如何在代码里设置小些