#include "stdafx.h"
#include "ftp_client.h"
static boost::regex expression("^([0-9]+)(\\-| |$)(.*)$");
ftp_client::ftp_client() :cmd_socket_(io_service_),
work_(io_service_),data_socket_(io_service_),is_logined(false), is_connected(false)
{
thread_ptr ptr(new boost::thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service_))));
}
ftp_client::~ftp_client()
{
if (data_socket_.is_open()){
data_socket_.shutdown(boost::asio::socket_base::shutdown_both);
data_socket_.close();
}
if (cmd_socket_.is_open()){
cmd_socket_.shutdown(boost::asio::socket_base::shutdown_both);
cmd_socket_.close();
}
}
bool ftp_client::connect(std::string host, std::string port, std::string user, std::string passwd)
{
if (is_connected){
return true;
}
if (host.empty() || port.empty() || user.empty() || passwd.empty()){
return false;
}
user_ = user; passwd_ = passwd; host_ = host; port_ = port;
ip::tcp::resolver resolver(io_service_);
ip::tcp::resolver::query query(host_, port_);
ip::tcp::resolver::iterator it = resolver.resolve(query);
cmd_socket_.async_connect( *it,
boost::bind(&ftp_client::handle_connect,
this, boost::asio::placeholders::error));
return true;
}
void ftp_client::upload_file(std::string filename)
{//async upload file
try{
boost::mutex::scoped_lock lock(iomutex);
bool write_in_progress = !file_list.empty();
file_list.push_back(std::make_pair(true, filename));
if (!write_in_progress && is_logined){
_write_message("PASV \r\n");
}
}catch(...){
save_info((boost::format("%1%<%2%>: Remote is leave, session is close") %__FILE__ %__LINE__ ).str());
}
}
string ftp_client::download_file(std::string filename)
{//sync download file
try{
boost::mutex::scoped_lock lock(cond_mutex);
{
boost::mutex::scoped_lock lock(iomutex);
bool write_in_progress = !file_list.empty();
file_list.push_back(std::make_pair(false, filename));
if (!write_in_progress && is_logined){
_write_message("PASV \r\n");
}
}
condition.wait(lock);
}catch(...){
save_info(boost::format ("Remote is leave, session is close").str());
}
boost::filesystem::path path = boost::filesystem::current_path();
path += "\\download";
boost::filesystem::create_directory(path);
path += "\\";
path += boost::filesystem::path(filename).filename();
return path.string();
}
void ftp_client::start()
{
boost::asio::async_read_until(cmd_socket_,
receive_msg, '\n',
boost
Boost实现FTP上传文件
最新推荐文章于 2023-11-30 18:26:31 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)