提升asio:如何保持客户端连接活着?
发布时间:2020-12-16 09:31:00 所属栏目:百科 来源:网络整理
导读:我尝试创建一个在服务器上保持连接活动的客户端. 但是,当我收到一次数据时,连接已关闭.我不明白为什么. 我认为我应该制作一个循环,但我们告诉我这不是一个好主意. class client{public: client(boost::asio::io_service io_service,const std::string host,c
我尝试创建一个在服务器上保持连接活动的客户端.
但是,当我收到一次数据时,连接已关闭.我不明白为什么. 我认为我应该制作一个循环,但我们告诉我这不是一个好主意. 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,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; } 解决方法
首先,您的asio io_service正在完成工作.在handle_read中,你把评论“也许我应该把东西放在这里”你可以安排下一个异步读操作:
connection_.async_read(stocks_,boost::asio::placeholders::error)); 通常情况下,如果您是异步编程,一旦是异步编程.调用handler,你将调用下一个异步.操作,就像你在异步连接处理程序中所做的那样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |