c++ - 如何使用 boost::asio 保持套接字连接?

标签 c++ sockets boost boost-asio

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

我只想再次接受这个套接字...

最佳答案

打开接受器后,将其绑定(bind)到一个端点,这个端点就是您接受的对象,它(或者与其关联的套接字)将被重新使用。您传递给 async_accept 的套接字引用是一个新套接字,它将保存下一个传入连接。

例如在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() 返回对该套接字的引用。接受器仍在接受最初传递给它的同一套接字或端口。

关于c++ - 如何使用 boost::asio 保持套接字连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757486/

相关文章:

c - 使用已经处于 TIME_WAIT 状态的选项 SO_REUSEADDR 重用端口是个好主意吗?

linux - 如何以编程方式增加 LInux 上 UDP 套接字的每个套接字缓冲区?

java - ServerSocket 上的accept() 、 close() 方法

c++ - 使用 CMake 和 Boost 单元测试进行编译

c++ - 如何在 Win32 项目 C++ 中将多个项目添加到列表框中?

c++ - 代码 Composer 工作室 : fatal error: could not open source file "types.h"

c++ - 为什么我的类的复制初始化不适用于使用字符串文字的 string_view?

c++ - 一轮编译生成两个或多个输出文件

python - 使用 Boost-Python 包装枚举

c++ - 在 boost::posix_time 中设置值(年、月、日...)