如何使用boost :: asio保持套接字连接存活?

时间:2011-04-22 16:18:09

标签: c++ sockets boost boost-asio

如何在使用acceptor.async_accept(* socket,accept_handler)异步接受tcp连接后重用tcp连接?

我只想再次接受这个插座...

2 个答案:

答案 0 :(得分:2)

打开接受器后,将其绑定到端点,此端点是您接受的端点,它(或者更确切地说是与之关联的套接字)将被重用。传递给async_accept的套接字引用是一个新的套接字,它将保存下一个传入连接。

E.g。在HTTP Server Boost asio示例中:

server::server(const std::string& address, const std::string& port,
    const std::string& doc_root)
  : io_service_(),
    acceptor_(io_service_),
    connection_manager_(),
    new_connection_(new connection(io_service_,
          connection_manager_, request_handler_)),
    request_handler_(doc_root)
{
  // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
  boost::asio::ip::tcp::resolver resolver(io_service_);
  boost::asio::ip::tcp::resolver::query query(address, port);
  boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
  acceptor_.open(endpoint.protocol());
  acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
  acceptor_.bind(endpoint);
  acceptor_.listen();
  acceptor_.async_accept(new_connection_->socket(),
      boost::bind(&server::handle_accept, this,
        boost::asio::placeholders::error));
}

为每个async_accept创建的new_connection对象都有一个新套接字来接收传入连接。接受器在内部保留一个套接字用于接受与您传递它的端点相关联的接口。

如果你看看handle_accept:

void server::handle_accept(const boost::system::error_code& e)
{
  if (!e)
  {
    connection_manager_.start(new_connection_);
    new_connection_.reset(new connection(io_service_,
          connection_manager_, request_handler_));
    acceptor_.async_accept(new_connection_->socket(),
        boost::bind(&server::handle_accept, this,
          boost::asio::placeholders::error));
  }
}

您可以看到构建了一个新的连接对象(并在其中创建了一个新的套接字)来保存下一个传入连接。 new_connection _-> socket()返回对该套接字的引用。接受者仍然接受最初传递给它的同一个套接字或端口。

答案 1 :(得分:0)

如果我正确理解你的问题,你所遇到的问题似乎是将接受的套接字连接传递给处理传输的处理方法,以便释放接受器以获得新的连接。在您接受连接后,您(显然)需要处理它遇到的传输。因此,创建一个接受连接的接受器方法,在建立连接之后,创建一个新的处理类并向它传递对io_service和连接所在的套接字的引用,允许该类处理该连接的传输并具有接受器方法等待更多连接(并冲洗和重复)。处理方法将特定于您的应用程序。