Re: [Boost-users] [asio]Why std::ofstream AND boost::asio::async_read() fails?
I'm not able to see why downloading is sometimes fails in asio asyncread().
I found out my bug resolution that is moving the std::ofstream as a class member to stack of function calling itself. Thanks, Yasuhiko Yoshimura class ftp_client_dtp { // Start socket and etc. void start() { work_resolver_.reset(new boost::asio::ip::tcp::resolver(work_io_service_)); work_socket_.reset(new boost::asio::ip::tcp::socket(work_io_service_)); work_.reset(new boost::asio::io_service::work(work_io_service_)); work_thread_.reset(new boost::thread( boost::bind(&boost::asio::io_service::run, &work_io_service_))); ... // Start an asynchronous resolve to translate the server and service names // into a list of endpoints. ... } ... private: ... void handle_read_content(const boost::system::error_code& err) { if (!err || err == boost::asio::error::eof) { std::string spath = scurrentpath_ + "\\" + sfilename_; // insert the next line that the ofstream to stack. std::ofstream f(spath.c_str(), std::ios::binary | std::ios_base::out | std::ios_base::app | std::ios_base::ate); if (response_.size() > 0) { f << &response_; } f.close(); if (!err) { // Continue reading remaining data until EOF. boost::asio::async_read(*work_socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&ftp_client_dtp::handle_read_content, shared_from_this(), boost::asio::placeholders::error)); } else { // eof std::cout << err; do_close(); } } else { std::cout << err; do_close(); } } void do_close() { work_socket_->close(); } // comment out the next line. // std::ofstream f; std::string sip_, sport_, scurrentpath_, sfilename_; boost::asio::streambuf request_; boost::asio::streambuf response_; boost::scoped_ptrboost::asio::ip::tcp::resolver work_resolver_; boost::scoped_ptrboost::asio::ip::tcp::socket work_socket_; boost::asio::io_service work_io_service_; boost::scoped_ptrboost::asio::io_service::work work_; boost::scoped_ptrboost::thread work_thread_; };
participants (1)
-
Yasuhiko Yoshimura (informax.co.jp)