1. 程式人生 > >boost::asio 無法接受新連線的處理方法

boost::asio 無法接受新連線的處理方法

寫了一個壓力測試程式,建立2000個連線,TCP server基於boost::asio實現。用kill殺掉2000個連線,再重新建立,如此反覆多次後,TCP server不再接受新的連線,已經建立的連線仍然能夠正常工作。用wc -l /proc/net/tcp 命令檢查tcp 連線數,不存在大量未被系統關閉的連線。

然後添加了一行程式碼:

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都能正常接受新的連線了。