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