1#ifndef NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
2#define NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
17NEFORCE_BEGIN_NAMESPACE__
45#ifdef NEFORCE_PLATFORM_WINDOWS
53 void operator()(::SSL* ssl)
const noexcept {
61 void operator()(::X509* cert)
const noexcept {
62 if (cert !=
nullptr) {
67 using x509_ptr = unique_ptr<::X509, x509_deleter>;
69 unique_ptr<::SSL, ssl_deleter> ssl_;
72 void handle_ssl_error(
int ret,
const char* operation);
254 NEFORCE_NODISCARD const
string&
last_error()
const {
return last_error_; }
260 NEFORCE_NODISCARD
bool is_valid() const noexcept {
return ssl_ !=
nullptr; }
266 explicit operator bool() const noexcept {
return is_valid(); }
272 NEFORCE_NODISCARD ::SSL*
native_handle() const noexcept {
return ssl_.get(); }
280 NEFORCE_NODISCARD ::SSL*
release() noexcept {
return ssl_.release(); }
349 template <
typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<
void(error_code)>>,
int> = 0>
373#ifdef NEFORCE_STANDARD_20
389NEFORCE_END_NAMESPACE__
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对象所有权
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对象指针
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 常量
@ reset
调用sqlite3_reset重置语句(用于预处理语句复用)
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针