2010-11-28 157 views
3

我尝试创建一个将连接保持在服务器上的客户端。Boost asio:如何保持客户端连接活着?

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

我认为我应该做一个循环,但是我们告诉过我这不是一个好主意。

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_; 
}; 

主要如下所示:

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    // Check command line arguments. 
    if (argc != 3) 
    { 
     std::cerr << "Usage: client <host> <port>" << std::endl; 
     return 1; 
    } 

    boost::asio::io_service io_service; 

    client client(io_service, argv[1], argv[2]); 
    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << e.what() << std::endl; 
    } 

    return 0; 
} 

回答

7

原因之一,您的ASIO io_service对象已经不多了工作要做。在handle_read,你把你的评论“也许我应该把这里的东西”,你可以安排下一次异步读操作:

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

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

+0

+1这是正确的答案,您需要链接您的“异步”操作。 OP很可能需要在`client :: handle_read`方法中启动`async_write`或另一个`async_read`。 – 2010-11-29 01:57:10