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
37class NEFORCE_API tcp_client_base {
38public:
39 using exception_handler_t = function<void(const exception&)>;
40 using connect_callback_t = function<void(const string&, ports)>;
42
43protected:
46
51
56
57 bool auto_reconnect_ = false;
58 bool prefer_ipv6_ = false;
60
64
70
75 virtual bool post_connect() { return true; }
76
80 virtual void pre_disconnect() {}
81
88 bool try_connect_to_ip(const string& ip, ports port);
89
95
100 NEFORCE_ALWAYS_INLINE void handle_exception(const exception& e) const {
101 if (exception_handler_) {
103 }
104 }
105
106public:
112
118 explicit tcp_client_base(dns_client::config cfg, bool use_tcp = false) :
119 dns_(make_unique<dns_client>(_NEFORCE move(cfg), use_tcp)) {}
120
125
126 tcp_client_base(const tcp_client_base&) = delete;
127 tcp_client_base& operator=(const tcp_client_base&) = delete;
128 tcp_client_base(tcp_client_base&&) noexcept = default;
129 tcp_client_base& operator=(tcp_client_base&&) noexcept = default;
130
137
142 NEFORCE_NODISCARD milliseconds connect_timeout() const noexcept { return connect_timeout_; }
143
150
155 NEFORCE_NODISCARD milliseconds send_timeout() const noexcept { return send_timeout_; }
156
163
168 NEFORCE_NODISCARD milliseconds recv_timeout() const noexcept { return recv_timeout_; }
169
176 void set_auto_reconnect(bool enable, int max_attempts = 3);
177
182 NEFORCE_NODISCARD bool is_auto_reconnect() const noexcept { return auto_reconnect_; }
183
188 NEFORCE_NODISCARD int reconnect_attempts() const noexcept { return reconnect_attempts_; }
189
194 NEFORCE_NODISCARD int current_reconnect_attempt() const noexcept { return current_reconnect_attempt_; }
195
202
207 NEFORCE_NODISCARD milliseconds reconnect_delay() const noexcept { return reconnect_delay_; }
208
213 void set_prefer_ipv6(bool prefer) noexcept { prefer_ipv6_ = prefer; }
214
219 NEFORCE_NODISCARD bool prefer_ipv6() const noexcept { return prefer_ipv6_; }
220
225 void set_dns_server(dns_client::config cfg) { dns_->set_config(move(cfg)); }
226
232
238
244
254 virtual bool connect(const string& host, ports port);
255
259 void disconnect() noexcept;
260
269 ssize_t send(const void* data, size_t length);
270
276 ssize_t send(string_view data) { return send(data.data(), data.size()); }
277
286 bool send_all(const void* data, size_t length);
287
293 bool send_all(string_view data) { return send_all(data.data(), data.size()); }
294
301 ssize_t receive(void* buffer, size_t length);
302
310 vector<char> receive_all(size_t max_size = 0);
311
320
328 optional<string> receive_line(size_t max_length = 8192);
329
334 NEFORCE_NODISCARD bool is_connected() const noexcept { return socket_ && socket_->is_open(); }
335
340 NEFORCE_NODISCARD bool is_reconnecting() const noexcept { return is_reconnecting_; }
341
346 NEFORCE_NODISCARD const string& connected_host() const noexcept { return connected_host_; }
347
352 NEFORCE_NODISCARD ports connected_port() const noexcept { return connected_port_; }
353
359 NEFORCE_NODISCARD tcp_socket& socket();
360
366 NEFORCE_NODISCARD const tcp_socket& socket() const;
367
372 NEFORCE_NODISCARD dns_client& get_dns_client() noexcept { return *dns_; }
373
378 NEFORCE_NODISCARD const dns_client& get_dns_client() const noexcept { return *dns_; }
379};
380
387class NEFORCE_API tcp_client final : public tcp_client_base {
388public:
390
391protected:
393};
394 // TCP
396
401
433class NEFORCE_API ssl_client final : public tcp_client_base {
434private:
435 optional<ssl_context> ssl_ctx_;
436 string sni_hostname_;
437 bool verify_peer_ = true;
438 bool ssl_initialized_ = false;
439
440protected:
442
443 bool post_connect() override;
444 void pre_disconnect() override { ssl_initialized_ = false; }
445
446public:
450 ssl_client() = default;
451
456 explicit ssl_client(ssl_context ctx);
457
464
470 void set_verify_peer(bool verify);
471 NEFORCE_NODISCARD bool get_verify_peer() const noexcept { return verify_peer_; }
472
478 void set_sni_hostname(string hostname);
479 NEFORCE_NODISCARD const string& sni_hostname() const noexcept { return sni_hostname_; }
480
486 bool load_ca_file(const string& ca_file);
487
493 bool load_ca_path(const string& ca_path);
494
499 NEFORCE_NODISCARD string peer_certificate_info() const;
500
505 NEFORCE_NODISCARD string cipher_name() const;
506
511 NEFORCE_NODISCARD string protocol_version() const;
512
517 NEFORCE_NODISCARD bool has_ssl_context() const noexcept { return ssl_ctx_.has_value() && ssl_ctx_->is_valid(); }
518
523 NEFORCE_NODISCARD bool is_ssl_initialized() const noexcept { return ssl_initialized_; }
524
530 NEFORCE_NODISCARD ssl_socket& ssl_socket_ref();
531
537 NEFORCE_NODISCARD const ssl_socket& ssl_socket_ref() const;
538};
539 // SSL/TLS
541
542NEFORCE_END_NAMESPACE__
543#endif // NEFORCE_NETWORK_TCP_TCP_CLIENT_HPP__
DNS客户端类
函数包装器主模板声明
内存视图模板
可选值类
ssl_client()=default
默认构造函数
string peer_certificate_info() const
获取对等方证书信息
bool load_ca_path(const string &ca_path)
加载CA证书目录
void pre_disconnect() override
连接断开前的清理工作
string cipher_name() const
获取当前密码套件名称
string protocol_version() const
获取当前协议版本
ssl_client(ssl_context ctx)
构造函数(带SSL上下文)
bool post_connect() override
连接建立后的额外处理
unique_ptr< tcp_socket > create_socket() override
创建新的socket对象
void set_sni_hostname(string hostname)
设置SNI主机名
void set_ssl_context(ssl_context ctx)
设置SSL上下文
bool has_ssl_context() const noexcept
检查是否有SSL上下文
bool load_ca_file(const string &ca_file)
加载CA证书文件
ssl_socket & ssl_socket_ref()
获取SSL socket引用
const ssl_socket & ssl_socket_ref() const
获取SSL socket常量引用
bool is_ssl_initialized() const noexcept
检查SSL是否已初始化
void set_verify_peer(bool verify)
设置是否验证对等方证书
SSL/TLS上下文管理类
SSL/TLS安全Socket类
TCP客户端基类
vector< char > receive_all(size_t max_size=0)
接收所有可用数据
int reconnect_attempts_
最大重连次数
const string & connected_host() const noexcept
获取当前连接的主机名
void handle_exception(const exception &e) const
处理异常
ssize_t send(string_view data)
发送字符串数据
connect_callback_t connect_callback_
连接成功回调
bool is_reconnecting() const noexcept
检查是否正在重连
virtual void pre_disconnect()
连接断开前的清理工作
bool try_connect_to_ip(const string &ip, ports port)
尝试连接到指定IP
const tcp_socket & socket() const
获取底层socket常量引用
const dns_client & get_dns_client() const noexcept
获取DNS客户端常量引用
void set_reconnect_delay(milliseconds delay)
设置重连延迟时间
bool is_connected() const noexcept
检查是否已连接
void set_prefer_ipv6(bool prefer) noexcept
设置是否优先使用IPv6
milliseconds reconnect_delay() const noexcept
获取重连延迟时间
milliseconds reconnect_delay_
重连延迟
tcp_client_base(dns_client::config cfg, bool use_tcp=false)
构造函数(带DNS客户端)
void set_connect_timeout(milliseconds timeout)
设置连接超时时间
milliseconds connect_timeout() const noexcept
获取连接超时时间
dns_client & get_dns_client() noexcept
获取DNS客户端
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)
设置连接成功回调
unique_ptr< dns_client > dns_
DNS解析客户端
virtual unique_ptr< tcp_socket > create_socket()=0
创建新的socket对象
milliseconds send_timeout() const noexcept
获取发送超时时间
milliseconds recv_timeout_
接收超时
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()
析构函数
ports connected_port() const noexcept
获取当前连接的端口
bool reconnect_if_needed()
需要时执行重连
void set_exception_handler(exception_handler_t handler)
设置异常处理器
tcp_socket & socket()
获取底层socket引用
void set_auto_reconnect(bool enable, int max_attempts=3)
设置自动重连
virtual bool post_connect()
连接建立后的额外处理
int reconnect_attempts() const noexcept
获取最大重连次数
void set_recv_timeout(milliseconds timeout)
设置接收超时时间
ssize_t send(const void *data, size_t length)
发送数据
bool prefer_ipv6() const noexcept
检查是否优先使用IPv6
void set_dns_server(dns_client::config cfg)
设置DNS服务器配置
bool auto_reconnect_
是否自动重连
function< void(const string &, ports)> connect_callback_t
连接回调类型
milliseconds recv_timeout() const noexcept
获取接收超时时间
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()
默认构造函数
int current_reconnect_attempt() const noexcept
获取当前重连尝试次数
bool receive_exact(memory_view< char > buffer)
接收指定大小的数据
milliseconds send_timeout_
发送超时
bool is_auto_reconnect() const noexcept
检查是否启用自动重连
milliseconds connect_timeout_
连接超时
virtual bool connect(const string &host, ports port)
连接到服务器
TCP客户端类
unique_ptr< tcp_socket > create_socket() override
创建新的socket对象
tcp_client_base()
默认构造函数
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
字符字符串视图
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
constexpr unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
SSL/TLS安全Socket实现
通用原子类型模板
DNS客户端配置
异常基类
网络端口封装类