NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
ftp_client.hpp
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__
7
8class NEFORCE_API ftp_client final : public ftp_protocol {
9public:
10 struct entry {
11 string name;
12 string raw;
13 uint64_t size = 0;
14 bool is_directory = false;
15 };
16
17private:
18 bool connected_ = false;
19 tls_mode tls_mode_ = tls_mode::none;
20 string sni_host_;
21
22 transfer_mode transfer_mode_ = transfer_mode::binary;
23 passive_mode passive_mode_ = passive_mode::passive;
24 string server_host_;
25 ports server_port_{ports::FTP};
26
27 static constexpr int kActiveAcceptTimeoutSec = 30;
28
29 response send_command(const string& cmd);
30
31 void expect_code(int expected, const string& cmd);
32 void expect_codes(std::initializer_list<int> codes, const string& cmd);
33
34 tcp_socket open_data_channel();
35 ssl_stream wrap_data_channel(tcp_socket sock);
36
37 void do_ctrl_tls_handshake();
38 void do_post_connect();
39
40 vector<char> download_impl(const string& remote_path, tcp_socket& data_sock, uint64_t offset);
41
42 void upload_impl(const string& remote_path, tcp_socket& data_sock, const char* data, size_t len, uint64_t offset);
43
44 void open_and_connect(const ip_address& addr);
45
46 static entry parse_list_entry(const string& line);
47
48public:
49 ftp_client() = default;
50
51 ftp_client(ftp_client&& other) = default;
52 ftp_client& operator=(ftp_client&& other) = default;
53
54 ftp_client(const ftp_client&) = delete;
55 ftp_client& operator=(const ftp_client&) = delete;
56
57 ~ftp_client() override;
58
59 void connect(const ip_address& addr, tls_mode mode = tls_mode::none, ssl_context* ctx = nullptr,
60 const string& sni_hostname = "");
61
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 = "");
64
65 tls_info upgrade_tls(ssl_context& ctx, const string& sni_hostname = "");
66
67 void disconnect();
68
69 void login(const string& username, const string& password);
70 void login_anonymous();
71
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);
75
76 NEFORCE_NODISCARD string pwd();
77 void cwd(const string& path);
78 void cdup();
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 = "");
83
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);
87
88 NEFORCE_NODISCARD vector<char> download(const string& remote_path);
89 NEFORCE_NODISCARD vector<char> download_resume(const string& remote_path, uint64_t offset);
90
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);
93
94 void noop();
95
96 NEFORCE_NODISCARD bool is_connected() const noexcept { return connected_ && is_open(); }
97
98 NEFORCE_NODISCARD bool is_tls_active() const noexcept { return tls_active_; }
99
100 NEFORCE_NODISCARD tls_info get_tls_info() const noexcept;
101};
102
103NEFORCE_END_NAMESPACE__
104#endif // NEFORCE_NETWORK_FTP_FTP_CLIENT_HPP__
virtual void connect(const ip_address &endpoint)
连接到远程端点(TCP客户端)
NEFORCE_NODISCARD bool is_open() const noexcept
检查socket是否已打开
DNS客户端实现
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()))
获取容器的底层数据指针
@ FTP
FTP控制端口
TCP Socket实现