Как сохранить соединение через сокет, используя boost :: asio? - PullRequest
1 голос
/ 22 апреля 2011

как я могу повторно использовать TCP-соединение после асинхронного принятия его с acceptor.async_accept (* socket, accept_handler)?

Я просто хочу снова принять это гнездо ...

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

После того, как вы открываете акцептор, вы связываете его с конечной точкой, эта конечная точка - это то, что вы принимаете, и она (или, скорее всего, связанный с ним сокет) используется повторно. Ссылка на сокет, которую вы передаете в async_accept, является новым сокетом, который будет содержать следующее входящее соединение.

например. в HTTP-сервере Пример усиления 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));
}

Объект new_connection, созданный для каждого async_accept, имеет новый сокет для приема входящего соединения. Акцептор хранит сокет для принятия на внутреннем уровне, который связан с конечной точкой, которую вы передаете.

Если вы посмотрите на 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 () возвращает ссылку на этот сокет. Акцептор по-прежнему принимает тот же сокет или порт, который был ему первоначально передан.

0 голосов
/ 22 апреля 2011

Если я правильно понимаю ваш вопрос, похоже, проблема в том, что вы передаете принятое соединение через сокет методу обработки, чтобы обработать передачи, чтобы акцептор мог быть освобожден для получения новых соединений.После того, как вы принимаете соединение, вам (очевидно) необходимо обработать переводы, которые с ним сталкиваются.Поэтому создайте метод acceptor, который принимает соединение, после того, как соединение установлено, создайте новый класс обработки и передайте ему ссылку на io_service и сокет, на котором установлено соединение, позвольте этому классу обрабатывать передачи для этого соединения и иметьметод акцептора ждет больше соединений (и промыть и повторить).Метод обработки будет зависеть от вашего приложения.

...