1#ifndef NEFORCE_NETWORK_FTP_FTP_SERVER_HPP__
2#define NEFORCE_NETWORK_FTP_FTP_SERVER_HPP__
3#include "NeForce/network/ftp/ftp_protocol.hpp"
5NEFORCE_BEGIN_NAMESPACE__
7class NEFORCE_API ftp_session final :
public ftp_protocol {
9 explicit ftp_session(tcp_socket&& sock) :
12 ftp_session(
const ftp_session&) =
delete;
13 ftp_session& operator=(
const ftp_session&) =
delete;
15 ftp_session(ftp_session&&) =
default;
16 ftp_session& operator=(ftp_session&&) =
default;
18 ~ftp_session()
override =
default;
20 pair<string, string> read_command();
22 void reply(
int code,
const string& msg) { send_response(code, msg); }
24 void accept_tls(ssl_context& ctx);
27class NEFORCE_API ftp_server {
29 tcp_acceptor acceptor_;
32 ftp_server() =
default;
34 ftp_server(
const ftp_server&) =
delete;
35 ftp_server& operator=(
const ftp_server&) =
delete;
37 ftp_server(ftp_server&&) =
default;
38 ftp_server& operator=(ftp_server&&) =
default;
40 ~ftp_server() =
default;
42 void listen(
const ip_address& endpoint,
int backlog = SOMAXCONN) { acceptor_.
open(endpoint, backlog); }
44 NEFORCE_NODISCARD ftp_session accept() {
return ftp_session(acceptor_.
accept()); }
46 NEFORCE_NODISCARD optional<ftp_session> accept_nonblock() {
49 return optional<ftp_session>{ftp_session{
move(*sock)}};
54 NEFORCE_NODISCARD
bool is_listening() const noexcept {
return acceptor_.
is_open(); }
61NEFORCE_END_NAMESPACE__
bool close() noexcept override
关闭socket
NEFORCE_NODISCARD bool is_open() const noexcept
检查socket是否已打开
NEFORCE_NODISCARD optional< ip_address > local_endpoint() const
获取本地端点地址
void listen(int backlog)
开始监听连接(TCP)
void open(const ip_address &endpoint, int backlog=SOMAXCONN)
打开并开始监听
NEFORCE_NODISCARD tcp_socket accept()
接受客户端连接(阻塞模式)
NEFORCE_NODISCARD optional< tcp_socket > accept_nonblock()
接受客户端连接(非阻塞模式)
@ release
释放操作,确保前面的读写不会被重排到后面
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素