NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
ssl_stream.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
2#define NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
3
11
17NEFORCE_BEGIN_NAMESPACE__
18
23
39class NEFORCE_API ssl_stream final : public async_stream {
40public:
45#ifdef NEFORCE_PLATFORM_WINDOWS
47#else
48 int;
49#endif
50
51private:
52 struct ssl_deleter {
53 void operator()(::SSL* ssl) const noexcept {
54 if (ssl != nullptr) {
55 ::SSL_free(ssl);
56 }
57 }
58 };
59
60 struct x509_deleter {
61 void operator()(::X509* cert) const noexcept {
62 if (cert != nullptr) {
63 ::X509_free(cert);
64 }
65 }
66 };
67 using x509_ptr = unique_ptr<::X509, x509_deleter>;
68
69 unique_ptr<::SSL, ssl_deleter> ssl_;
70 string last_error_;
71
72 void handle_ssl_error(int ret, const char* operation);
73
74public:
80 ssl_stream() = default;
81
87 explicit ssl_stream(const ssl_context& ctx) { reset(ctx); }
88
92 ssl_stream(ssl_stream&& other) noexcept = default;
93
97 ssl_stream& operator=(ssl_stream&& other) noexcept = default;
98
107 void reset(const ssl_context& ctx);
108
119
127 void accept();
128
137 bool connect();
138
145 void close() noexcept;
146
156 ssize_t read(void* buffer, size_t size);
157
167 ssize_t write(const void* buffer, size_t size);
168
178 vector<char> read_all(size_t max_size = 8192);
179
189 bool write_all(const void* data, size_t size);
190
197 NEFORCE_NODISCARD int pending() const;
198
208 void set_sni_hostname(const string& hostname);
209
216 NEFORCE_NODISCARD x509_ptr get_peer_certificate() const;
217
225 NEFORCE_NODISCARD bool verify_peer() const;
226
233 NEFORCE_NODISCARD string get_cipher_name() const;
234
239 NEFORCE_NODISCARD string get_version() const;
240
248 NEFORCE_NODISCARD string get_alpn_negotiated() const;
249
254 NEFORCE_NODISCARD const string& last_error() const { return last_error_; }
255
260 NEFORCE_NODISCARD bool is_valid() const noexcept { return ssl_ != nullptr; }
261
266 explicit operator bool() const noexcept { return is_valid(); }
267
272 NEFORCE_NODISCARD ::SSL* native_handle() const noexcept { return ssl_.get(); }
273
280 NEFORCE_NODISCARD ::SSL* release() noexcept { return ssl_.release(); }
281
290 void async_handshake(io_context& ctx, function<void(error_code)> handler);
291
299
309 void async_read(io_context& ctx, memory_view<char> buffer, function<void(error_code, size_t)> handler) override;
310
319 function<void(error_code, size_t)> handler) override;
320
331 function<void(error_code, size_t)> handler) override;
332
341 function<void(error_code, size_t)> handler) override;
342
349 template <typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<void(error_code)>>, int> = 0>
350 void async_handshake(io_context& ctx, Token&& token) {
352 }
353
359 auto async_handshake(io_context& ctx, use_future_t /*unused*/) {
361 async_handshake(ctx, function<void(error_code)>(result.get_handler()));
362 return result.get();
363 }
364
369 void async_handshake(io_context& ctx, detached_t /*unused*/) {
370 async_handshake(ctx, function<void(error_code)>([](error_code) {}));
371 }
372
373#ifdef NEFORCE_STANDARD_20
381 async_handshake(ctx, function<void(error_code)>(result.get_handler()));
382 return result.get();
383 }
384#endif
385};
386 // SSL/TLS
388
389NEFORCE_END_NAMESPACE__
390#endif // NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
异步流抽象基类
异步操作取消槽
异步流抽象基类
函数包装器主模板声明
统一异步操作核心
SSL/TLS上下文管理类
void async_write(io_context &ctx, memory_view< const char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler) override
异步SSL写入(带取消槽)
uintptr_t native_handle_type
原生文件描述符类型
auto async_handshake(io_context &ctx, use_awaitable_t)
异步TLS握手—use_awaitable
void close() noexcept
关闭SSL连接
void async_handshake(io_context &ctx, cancellation_slot &slot, function< void(error_code)> handler)
异步TLS握手(带取消槽)
string get_version() const
获取TLS协议版本
ssl_stream(const ssl_context &ctx)
从SSL上下文构造
void async_read(io_context &ctx, memory_view< char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler) override
异步SSL读取(带取消槽)
void async_write(io_context &ctx, memory_view< const char > buffer, function< void(error_code, size_t)> handler) override
异步SSL写入
void async_handshake(io_context &ctx, Token &&token)
异步TLS握手—任意可调用对象
vector< char > read_all(size_t max_size=8192)
读取所有可用数据
auto async_handshake(io_context &ctx, use_future_t)
异步TLS握手—use_future
ssize_t read(void *buffer, size_t size)
读取加密数据
void async_handshake(io_context &ctx, function< void(error_code)> handler)
异步TLS握手
bool write_all(const void *data, size_t size)
写入所有数据
::SSL * release() noexcept
释放SSL对象所有权
void accept()
执行服务器端TLS握手
x509_ptr get_peer_certificate() const
获取对等方证书
ssl_stream & operator=(ssl_stream &&other) noexcept=default
移动赋值运算符
void async_handshake(io_context &ctx, detached_t)
异步TLS握手—detached(即发即忘)
void async_read(io_context &ctx, memory_view< char > buffer, function< void(error_code, size_t)> handler) override
异步SSL读取
void reset(const ssl_context &ctx)
重置SSL流
string get_alpn_negotiated() const
获取ALPN协商的协议名称
::SSL * native_handle() const noexcept
获取原生SSL对象指针
bool connect()
执行客户端TLS握手
ssl_stream()=default
默认构造函数
void set_fd(native_handle_type fd)
设置底层socket文件描述符
string get_cipher_name() const
获取密码套件名称
bool is_valid() const noexcept
检查SSL对象是否有效
ssl_stream(ssl_stream &&other) noexcept=default
移动构造函数
void set_sni_hostname(const string &hostname)
设置SNI主机名(客户端)
ssize_t write(const void *buffer, size_t size)
写入加密数据
int pending() const
获取缓冲区中可读字节数
bool verify_peer() const
验证对等方证书
const string & last_error() const
获取最后错误信息
动态大小数组容器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr use_awaitable_t use_awaitable
use_awaitable 常量
constexpr use_future_t use_future
use_future 常量
uint64_t uintptr_t
可容纳指针的无符号整数类型
int64_t ssize_t
有符号大小类型
@ reset
调用sqlite3_reset重置语句(用于预处理语句复用)
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
统一异步操作核心
SSL/TLS上下文管理
完成令牌 trait 主模板
fire-and-forget 完成令牌
协程 awaitable 完成令牌
返回 future<T> 的完成令牌
协程 awaitable 完成令牌