1#ifndef NEFORCE_NETWORK_FTP_FTP_CLIENT_HPP__
2#define NEFORCE_NETWORK_FTP_FTP_CLIENT_HPP__
4#include "NeForce/network/ftp/ftp_protocol.hpp"
6NEFORCE_BEGIN_NAMESPACE__
8class NEFORCE_API ftp_client final :
public ftp_protocol {
14 bool is_directory =
false;
18 bool connected_ =
false;
19 tls_mode tls_mode_ = tls_mode::none;
22 transfer_mode transfer_mode_ = transfer_mode::binary;
23 passive_mode passive_mode_ = passive_mode::passive;
27 static constexpr int kActiveAcceptTimeoutSec = 30;
29 response send_command(
const string& cmd);
31 void expect_code(
int expected,
const string& cmd);
32 void expect_codes(std::initializer_list<int> codes,
const string& cmd);
34 tcp_socket open_data_channel();
35 ssl_stream wrap_data_channel(tcp_socket sock);
37 void do_ctrl_tls_handshake();
38 void do_post_connect();
40 vector<char> download_impl(
const string& remote_path, tcp_socket& data_sock,
uint64_t offset);
42 void upload_impl(
const string& remote_path, tcp_socket& data_sock,
const char*
data,
size_t len,
uint64_t offset);
44 void open_and_connect(
const ip_address& addr);
46 static entry parse_list_entry(
const string& line);
49 ftp_client() =
default;
51 ftp_client(ftp_client&& other) =
default;
52 ftp_client& operator=(ftp_client&& other) =
default;
54 ftp_client(
const ftp_client&) =
delete;
55 ftp_client& operator=(
const ftp_client&) =
delete;
57 ~ftp_client()
override;
59 void connect(
const ip_address& addr, tls_mode mode = tls_mode::none, ssl_context* ctx =
nullptr,
60 const string& sni_hostname =
"");
62 void connect(
const string& hostname, ports port =
ports::FTP, tls_mode mode = tls_mode::none,
63 dns_client* dns =
nullptr, ssl_context* ctx =
nullptr,
const string& sni =
"");
65 tls_info upgrade_tls(ssl_context& ctx,
const string& sni_hostname =
"");
69 void login(
const string& username,
const string& password);
70 void login_anonymous();
72 void set_transfer_mode(transfer_mode mode);
73 void set_passive_mode(passive_mode mode)
noexcept { passive_mode_ = mode; }
74 void set_data_protection(
bool protect);
76 NEFORCE_NODISCARD
string pwd();
77 void cwd(
const string& path);
79 void mkdir(
const string& path);
80 void rmdir(
const string& path);
81 NEFORCE_NODISCARD vector<entry> list(
const string& path =
"");
82 NEFORCE_NODISCARD vector<string> nlst(
const string& path =
"");
84 NEFORCE_NODISCARD
uint64_t file_size(
const string& remote_path);
85 void rename(
const string& from,
const string& to);
86 void remove(
const string& remote_path);
88 NEFORCE_NODISCARD vector<char> download(
const string& remote_path);
89 NEFORCE_NODISCARD vector<char> download_resume(
const string& remote_path,
uint64_t offset);
91 void upload(
const string& remote_path,
const char*
data,
size_t len);
92 void upload_resume(
const string& remote_path,
const char*
data,
size_t len,
uint64_t offset);
96 NEFORCE_NODISCARD
bool is_connected() const noexcept {
return connected_ &&
is_open(); }
98 NEFORCE_NODISCARD
bool is_tls_active() const noexcept {
return tls_active_; }
100 NEFORCE_NODISCARD tls_info get_tls_info() const noexcept;
103NEFORCE_END_NAMESPACE__
virtual void connect(const ip_address &endpoint)
连接到远程端点(TCP客户端)
NEFORCE_NODISCARD bool is_open() const noexcept
检查socket是否已打开
unsigned long long uint64_t
64位无符号整数类型
constexpr Iterator remove(Iterator first, Iterator last, const T &value)
移除范围中等于指定值的元素
NEFORCE_ALWAYS_INLINE_INLINE bool name(char *buffer, size_t size)
获取当前线程名称
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针