boost::asio 无法接受新连接的处理方法

写了一个压力测试程序,创建2000个连接,TCP server基于boost::asio实现。用kill杀掉2000个连接,再重新创建,如此反复多次后,TCP server不再接受新的连接,已经建立的连接仍然能够正常工作。用wc -l /proc/net/tcp 命令检查tcp 连接数,不存在大量未被系统关闭的连接。

在stackoverflow上问了别人,帖子:http://stackoverflow.com/questions/20300926/why-my-app-based-on-boostasio-didnt-accept-new-connection

有人提醒用netstat -ap命令检查,发现有很多CLOSE_WAIT状态的连接,这个状态分析参考http://blogs.technet.com/b/janelewis/archive/2010/03/09/explaining-close-wait.aspx

然后添加了一行代码:

acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));

同时编码时要注意在调用close方法之前调用shutdown。

  void CloseSocket() {
    try {
      socket.shutdown(tcp::socket::shutdown_both);
      socket.close();
      BOOST_LOG_TRIVIAL(warning) << "close the connection";
    } catch (std::exception& e) {
      BOOST_LOG_TRIVIAL(warning) << "thread id: " << this_thread::get_id() << " " << e.what();
    }
  }
   



搞定,现在试了几十次,TCP server都能正常接受新的连接了。


你可能感兴趣的:(boost::asio 无法接受新连接的处理方法)