NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
tcp_client.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_TCP_TCP_CLIENT_HPP__
2#define NEFORCE_NETWORK_TCP_TCP_CLIENT_HPP__
3
20
23NEFORCE_BEGIN_NAMESPACE__
24
29
34
42class NEFORCE_API tcp_client_base {
43public:
44 using exception_handler_t = function<void(const exception&)>;
45 using connect_callback_t = function<void(const string&, ports)>;
47
48protected:
51
56
61
62 bool auto_reconnect_ = false;
63 bool prefer_ipv6_ = false;
65
69
75
80 virtual bool post_connect() { return true; }
81
85 virtual void pre_disconnect() {}
86
93 bool try_connect_to_ip(const string& ip, ports port);
94
100
105 NEFORCE_ALWAYS_INLINE void handle_exception(const exception& e) const {
106 if (exception_handler_) {
108 }
109 }
110
111public:
115 tcp_client_base() = default;
116
122 dns_(_NEFORCE move(dns)) {}
123
128
129 tcp_client_base(const tcp_client_base&) = delete;
130 tcp_client_base& operator=(const tcp_client_base&) = delete;
131 tcp_client_base(tcp_client_base&&) noexcept = default;
132 tcp_client_base& operator=(tcp_client_base&&) noexcept = default;
133
140
145 NEFORCE_NODISCARD milliseconds connect_timeout() const noexcept { return connect_timeout_; }
146
153
158 NEFORCE_NODISCARD milliseconds send_timeout() const noexcept { return send_timeout_; }
159
166
171 NEFORCE_NODISCARD milliseconds recv_timeout() const noexcept { return recv_timeout_; }
172
179 void set_auto_reconnect(bool enable, int max_attempts = 3);
180
185 NEFORCE_NODISCARD bool is_auto_reconnect() const noexcept { return auto_reconnect_; }
186
191 NEFORCE_NODISCARD int reconnect_attempts() const noexcept { return reconnect_attempts_; }
192
197 NEFORCE_NODISCARD int current_reconnect_attempt() const noexcept { return current_reconnect_attempt_; }
198
205
210 NEFORCE_NODISCARD milliseconds reconnect_delay() const noexcept { return reconnect_delay_; }
211
216 void set_prefer_ipv6(bool prefer) noexcept { prefer_ipv6_ = prefer; }
217
222 NEFORCE_NODISCARD bool prefer_ipv6() const noexcept { return prefer_ipv6_; }
223
228 void set_dns_server(dns_client::config cfg) { dns_.set_config(move(cfg)); }
229
235
241
247
257 virtual bool connect(const string& host, ports port);
258
262 void disconnect() noexcept;
263
272 ssize_t send(const void* data, size_t length);
273
279 ssize_t send(string_view data) { return send(data.data(), data.size()); }
280
289 bool send_all(const void* data, size_t length);
290
296 bool send_all(string_view data) { return send_all(data.data(), data.size()); }
297
304 ssize_t receive(void* buffer, size_t length);
305
313 vector<char> receive_all(size_t max_size = 0);
314
323
331 optional<string> receive_line(size_t max_length = 8192);
332
337 NEFORCE_NODISCARD bool is_connected() const noexcept { return socket_ && socket_->is_open(); }
338
343 NEFORCE_NODISCARD bool is_reconnecting() const noexcept { return is_reconnecting_; }
344
349 NEFORCE_NODISCARD const string& connected_host() const noexcept { return connected_host_; }
350
355 NEFORCE_NODISCARD ports connected_port() const noexcept { return connected_port_; }
356
362 NEFORCE_NODISCARD tcp_socket& socket();
363
369 NEFORCE_NODISCARD const tcp_socket& socket() const;
370
375 NEFORCE_NODISCARD dns_client& get_dns_client() noexcept { return dns_; }
376
381 NEFORCE_NODISCARD const dns_client& get_dns_client() const noexcept { return dns_; }
382};
383
390class NEFORCE_API tcp_client final : public tcp_client_base {
391public:
393
394protected:
396};
397 // TCP
399
404
436class NEFORCE_API ssl_client final : public tcp_client_base {
437private:
438 optional<ssl_context> ssl_ctx_;
439 string sni_hostname_;
440 bool verify_peer_ = true;
441 bool ssl_initialized_ = false;
442
443protected:
445
446 bool post_connect() override;
447 void pre_disconnect() override { ssl_initialized_ = false; }
448
449public:
453 ssl_client() = default;
454
459 explicit ssl_client(ssl_context ctx);
460
467
473 void set_verify_peer(bool verify);
474 NEFORCE_NODISCARD bool get_verify_peer() const noexcept { return verify_peer_; }
475
481 void set_sni_hostname(string hostname);
482 NEFORCE_NODISCARD const string& sni_hostname() const noexcept { return sni_hostname_; }
483
489 bool load_ca_file(const string& ca_file);
490
496 bool load_ca_path(const string& ca_path);
497
502 NEFORCE_NODISCARD string_view peer_certificate_info() const;
503
508 NEFORCE_NODISCARD string_view cipher_name() const;
509
514 NEFORCE_NODISCARD string_view protocol_version() const;
515
520 NEFORCE_NODISCARD bool has_ssl_context() const noexcept { return ssl_ctx_.has_value() && ssl_ctx_->is_valid(); }
521
526 NEFORCE_NODISCARD bool is_ssl_initialized() const noexcept { return ssl_initialized_; }
527
533 NEFORCE_NODISCARD ssl_socket& ssl_socket_ref();
534
540 NEFORCE_NODISCARD const ssl_socket& ssl_socket_ref() const;
541};
542 // SSL/TLS
544 // Network
546
547NEFORCE_END_NAMESPACE__
548#endif // NEFORCE_NETWORK_TCP_TCP_CLIENT_HPP__
DNS客户端类
函数包装器主模板声明
内存视图模板
可选值类
ssl_client()=default
默认构造函数
bool load_ca_path(const string &ca_path)
加载CA证书目录
void pre_disconnect() override
连接断开前的清理工作
NEFORCE_NODISCARD string_view cipher_name() const
获取当前密码套件名称
NEFORCE_NODISCARD bool is_ssl_initialized() const noexcept
检查SSL是否已初始化
ssl_client(ssl_context ctx)
构造函数(带SSL上下文)
bool post_connect() override
连接建立后的额外处理
unique_ptr< tcp_socket > create_socket() override
创建新的socket对象
NEFORCE_NODISCARD string_view protocol_version() const
获取当前协议版本
void set_sni_hostname(string hostname)
设置SNI主机名
void set_ssl_context(ssl_context ctx)
设置SSL上下文
NEFORCE_NODISCARD const ssl_socket & ssl_socket_ref() const
获取SSL socket常量引用
bool load_ca_file(const string &ca_file)
加载CA证书文件
NEFORCE_NODISCARD bool has_ssl_context() const noexcept
检查是否有SSL上下文
NEFORCE_NODISCARD string_view peer_certificate_info() const
获取对等方证书信息
NEFORCE_NODISCARD ssl_socket & ssl_socket_ref()
获取SSL socket引用
void set_verify_peer(bool verify)
设置是否验证对等方证书
SSL/TLS上下文管理类
SSL/TLS安全Socket类
TCP客户端基类
vector< char > receive_all(size_t max_size=0)
接收所有可用数据
int reconnect_attempts_
最大重连次数
ssize_t send(string_view data)
发送字符串数据
connect_callback_t connect_callback_
连接成功回调
virtual void pre_disconnect()
连接断开前的清理工作
bool try_connect_to_ip(const string &ip, ports port)
尝试连接到指定IP
void set_reconnect_delay(milliseconds delay)
设置重连延迟时间
void set_prefer_ipv6(bool prefer) noexcept
设置是否优先使用IPv6
milliseconds reconnect_delay_
重连延迟
NEFORCE_NODISCARD const tcp_socket & socket() const
获取底层socket常量引用
NEFORCE_NODISCARD bool is_connected() const noexcept
检查是否已连接
NEFORCE_NODISCARD bool is_reconnecting() const noexcept
检查是否正在重连
void set_connect_timeout(milliseconds timeout)
设置连接超时时间
NEFORCE_NODISCARD dns_client & get_dns_client() noexcept
获取DNS客户端
NEFORCE_NODISCARD milliseconds reconnect_delay() const noexcept
获取重连延迟时间
NEFORCE_NODISCARD ports connected_port() const noexcept
获取当前连接的端口
optional< string > receive_line(size_t max_length=8192)
接收一行数据(以\n结尾)
exception_handler_t exception_handler_
异常处理器
atomic< bool > is_reconnecting_
是否正在重连
void set_connect_callback(connect_callback_t callback)
设置连接成功回调
virtual unique_ptr< tcp_socket > create_socket()=0
创建新的socket对象
NEFORCE_NODISCARD int current_reconnect_attempt() const noexcept
获取当前重连尝试次数
NEFORCE_NODISCARD milliseconds send_timeout() const noexcept
获取发送超时时间
milliseconds recv_timeout_
接收超时
tcp_client_base()=default
默认构造函数
atomic< int > current_reconnect_attempt_
当前重连次数
ssize_t receive(void *buffer, size_t length)
接收数据
ports connected_port_
已连接的端口
bool send_all(string_view data)
发送所有字符串数据
disconnect_callback_t disconnect_callback_
断开连接回调
string connected_host_
已连接的主机名
bool send_all(const void *data, size_t length)
发送所有数据(保证全部发送)
virtual ~tcp_client_base()
析构函数
bool reconnect_if_needed()
需要时执行重连
NEFORCE_ALWAYS_INLINE void handle_exception(const exception &e) const
处理异常
void set_exception_handler(exception_handler_t handler)
设置异常处理器
void set_auto_reconnect(bool enable, int max_attempts=3)
设置自动重连
NEFORCE_NODISCARD int reconnect_attempts() const noexcept
获取最大重连次数
virtual bool post_connect()
连接建立后的额外处理
NEFORCE_NODISCARD bool is_auto_reconnect() const noexcept
检查是否启用自动重连
NEFORCE_NODISCARD const dns_client & get_dns_client() const noexcept
获取DNS客户端常量引用
NEFORCE_NODISCARD milliseconds recv_timeout() const noexcept
获取接收超时时间
NEFORCE_NODISCARD const string & connected_host() const noexcept
获取当前连接的主机名
NEFORCE_NODISCARD bool prefer_ipv6() const noexcept
检查是否优先使用IPv6
NEFORCE_NODISCARD tcp_socket & socket()
获取底层socket引用
void set_recv_timeout(milliseconds timeout)
设置接收超时时间
ssize_t send(const void *data, size_t length)
发送数据
dns_client dns_
DNS解析客户端
void set_dns_server(dns_client::config cfg)
设置DNS服务器配置
NEFORCE_NODISCARD milliseconds connect_timeout() const noexcept
获取连接超时时间
bool auto_reconnect_
是否自动重连
function< void(const string &, ports)> connect_callback_t
连接回调类型
void disconnect() noexcept
断开连接
void set_send_timeout(milliseconds timeout)
设置发送超时时间
function< void()> disconnect_callback_t
断开回调类型
bool prefer_ipv6_
是否优先IPv6
void set_disconnect_callback(disconnect_callback_t callback)
设置断开连接回调
unique_ptr< tcp_socket > socket_
TCP socket
function< void(const exception &)> exception_handler_t
异常处理器类型
tcp_client_base(dns_client dns)
构造函数(带DNS客户端)
bool receive_exact(memory_view< char > buffer)
接收指定大小的数据
milliseconds send_timeout_
发送超时
milliseconds connect_timeout_
连接超时
virtual bool connect(const string &host, ports port)
连接到服务器
TCP客户端类
unique_ptr< tcp_socket > create_socket() override
创建新的socket对象
tcp_client_base()=default
默认构造函数
TCP Socket类
独占智能指针
动态大小数组容器
DNS客户端实现
duration< int64_t, milli > milliseconds
毫秒持续时间
int64_t ssize_t
有符号大小类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
SSL/TLS安全Socket实现
通用原子类型模板
DNS客户端配置
异常基类
网络端口封装类