Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::asio保持套接字连接的活动状态?_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

C++ 如何使用boost::asio保持套接字连接的活动状态?

C++ 如何使用boost::asio保持套接字连接的活动状态?,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,在使用acceptor.async\u accept(*套接字,accept\u处理程序)异步接受tcp连接后,如何重用该连接 我只想再次在此套接字上接受…如果我正确理解您的问题,那么您遇到的问题似乎是将接受的套接字连接传递给处理方法来处理传输,以便释放接受方以获得新连接。接受连接后,您(显然)需要处理遇到的传输。因此,创建一个接受连接的接受器方法,在建立连接后,创建一个新的处理类,并将一个引用传递给io_服务和连接所在的套接字,允许该类处理该连接的传输,并让接受器方法等待更多连接(并冲洗和重复

在使用acceptor.async\u accept(*套接字,accept\u处理程序)异步接受tcp连接后,如何重用该连接


我只想再次在此套接字上接受…

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

打开接受程序并将其绑定到端点后,此端点就是您正在接受的端点,并且它(或者与其关联的套接字)将被重新使用。传递到async_accept的套接字引用是一个新套接字,它将保存下一个传入连接

例如,在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));
}
为每个异步\u接受创建的新\u连接对象都有一个新套接字来接收传入连接。接受程序在内部保留一个套接字,用于接受与您传递给它的端点关联的套接字

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

这个问题不清楚。您可以使用单个
接受器
对象接受多个连接。你有什么问题?