|
Boost Users : |
Subject: Re: [Boost-users] [asio]Why std::ofstream AND boost::asio::async_read() fails?
From: Yasuhiko Yoshimura \(informax.co.jp\) (yoshimura_at_[hidden])
Date: 2010-09-23 08:51:59
> 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_ptr<boost::asio::ip::tcp::resolver> work_resolver_;
boost::scoped_ptr<boost::asio::ip::tcp::socket> work_socket_;
boost::asio::io_service work_io_service_;
boost::scoped_ptr<boost::asio::io_service::work> work_;
boost::scoped_ptr<boost::thread> work_thread_;
};
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net