Boost实现FTP上传文件

本文详细介绍了如何利用Boost库中的thread和session模块实现FTP文件上传的过程,包括连接FTP服务器、创建会话、设置传输模式以及上传文件的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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',
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值