Boost asio:如何保持客户端连接的活动性?

Boost asio:如何保持客户端连接的活动性?,boost,boost-asio,Boost,Boost Asio,我尝试创建一个客户机,使连接在服务器上保持活动状态 但是,当我收到一次数据时,连接被关闭。我不明白为什么 我想我应该做一个循环,但我们告诉我那不是个好主意 class client { public: client(boost::asio::io_service& io_service, const std::string& host, const std::string& service) : connection_(io_service)

我尝试创建一个客户机,使连接在服务器上保持活动状态

但是,当我收到一次数据时,连接被关闭。我不明白为什么

我想我应该做一个循环,但我们告诉我那不是个好主意

class client
{
public:
  client(boost::asio::io_service& io_service,
      const std::string& host, const std::string& service)
    : connection_(io_service)
  {
    // Resolve the host name into an IP address.
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(host, service);
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator =
      resolver.resolve(query);
    boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;

    // Start an asynchronous connect operation.
    connection_.socket().async_connect(endpoint,
        boost::bind(&client::handle_connect, this,
          boost::asio::placeholders::error, ++endpoint_iterator));
  }

  /// Handle completion of a connect operation.
  void handle_connect(const boost::system::error_code& e,
      boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
  {
    if (!e)
    {
      // Successfully established connection. Start operation to read the list
      // of stocks. The connection::async_read() function will automatically
      // decode the data that is read from the underlying socket.
      connection_.async_read(stocks_,
          boost::bind(&client::handle_read, this,
            boost::asio::placeholders::error));
    }
    else
    {
      std::cerr << e.message() << std::endl;
    }
  }

  /// Handle completion of a read operation.
  void handle_read(const boost::system::error_code& e)
  {
    if (!e)
    {
      // Print out the data that was received.
      for (std::size_t i = 0; i < stocks_.size(); ++i)
      {
        std::cout << "Paquet numero " << i << "\n";
        std::cout << "  age: " << stocks_[i].age << "\n";
        std::cout << "  name: " << stocks_[i].nom << "\n";
      }

                // Maybe Should i put something here ?
    }
    else
    {
      // An error occurred.
        std::cerr << "Error : " << e.message() << std::endl;
        connection_.socket().close();
    }

    // or maybe here ?

  }

private:
  /// The connection to the server.
  connection            connection_;
  std::vector<stock>    stocks_;
};
类客户端
{
公众:
客户端(boost::asio::io_服务和io_服务,
常量std::字符串和主机,常量std::字符串和服务)
:连接(io_服务)
{
//将主机名解析为IP地址。
boost::asio::ip::tcp::解析器解析器(io_服务);
boost::asio::ip::tcp::resolver::query查询(主机、服务);
boost::asio::ip::tcp::解析器::迭代器端点\U迭代器=
解析(查询);
boost::asio::ip::tcp::endpoint=*endpoint\u迭代器;
//启动异步连接操作。
connection.socket().async\u connect(端点,
boost::bind(&client::handle_connect),这,
boost::asio::占位符::错误,++endpoint_迭代器);
}
///处理连接操作的完成。
无效句柄连接(const boost::system::error\u code&e,
boost::asio::ip::tcp::解析器::迭代器端点(迭代器)
{
如果(!e)
{
//已成功建立连接。请启动操作以读取列表
//connection::async_read()函数将自动
//解码从底层套接字读取的数据。
连接异步读取(存储),
boost::bind(&client::handle_read),这个,
boost::asio::占位符::错误);
}
其他的
{

std::cerr您的asio\u服务已无事可做。在handle\u read中,您可以在其中添加您的注释“也许我应该在此处放置一些内容”,您可以计划下一个异步读取操作:

connection_.async_read(stocks_,
      boost::bind(&client::handle_read, this,
        boost::asio::placeholders::error));

通常,如果您正在异步编程,一旦调用异步处理程序,您将调用下一个异步操作,就像在异步连接处理程序中所做的那样。

+1这是正确的答案,您需要链接您的
async
操作。OP很可能需要启动
异步写入
或另一个
异步读取
客户端::handle\u read
方法中。我遇到了类似的情况。我首先向服务器写入,然后从服务器读取,在句柄中立即获得EOF,而不是在服务器发送一些数据后调用handle。
connection_.async_read(stocks_,
      boost::bind(&client::handle_read, this,
        boost::asio::placeholders::error));