[asio]Why std::ofstream AND boost::asio::async_read() fails?
Hi All, I'm not able to see why downloading is sometimes fails in asio asyncread(). And I appriciate any suggestion. When 'comment===>> //' and 'insert ===>>' lines are valid, download file size is sometimes short than the original size from internet server(with big files). But if I put 'comment===>> //' back to no comment and remove 'insert ===>>' lines, the downloading result is perfect. class ftp_client_dtp { ... 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_))); ... comment===>> // std::string spath = scurrentpath_ + "\\" + sfilename_; comment===>> // f.open(spath.c_str(), std::ios::binary | std::ios_base::out); ... } ... void handle_read_content(const boost::system::error_code& err) { if (!err) { insert ===>> std::string spath = scurrentpath_ + "\\" + sfilename_; insert ===>> f.open(spath.c_str(), std::ios::binary | std::ios_base::out | std::ios_base::app); if (response_.size() > 0) { f << &response_; } insert ===>> f.close(); // 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 if (err == boost::asio::error::eof) { // eof std::cout << err; insert ===>> std::string spath = scurrentpath_ + "\\" + sfilename_; insert ===>> f.open(spath.c_str(), std::ios::binary | std::ios_base::out | std::ios_base::app); if (response_.size() > 0) { f << &response_; } insert ===>> f.close(); do_close(); } else { std::cout << err; do_close(); } } void do_close() { comment===>> // f.close(); ... } std::ofstream f; std::string sip_, sport_, scurrentpath_, sfilename_; ... boost::asio::streambuf response_; ... };
participants (1)
-
Yasuhiko Yoshimura (informax.co.jp)