1#ifndef NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
2#define NEFORCE_NETWORK_SSL_SSL_STREAM_HPP__
13NEFORCE_BEGIN_NAMESPACE__
46#ifdef NEFORCE_PLATFORM_WINDOWS
54 void operator()(::SSL* ssl)
const noexcept {
63 void operator()(::X509* cert)
const noexcept {
69 using x509_ptr = unique_ptr<::X509, x509_deleter>;
71 unique_ptr<::SSL, ssl_deleter> ssl_;
74 void handle_ssl_error(
int ret,
const char* operation);
240 NEFORCE_NODISCARD
const string&
last_error()
const {
return last_error_; }
246 NEFORCE_NODISCARD
bool is_valid() const noexcept {
return ssl_ !=
nullptr; }
252 explicit operator bool() const noexcept {
return is_valid(); }
258 NEFORCE_NODISCARD ::SSL*
native_handle() const noexcept {
return ssl_.get(); }
266 NEFORCE_NODISCARD ::SSL*
release() noexcept {
return ssl_.release(); }
273NEFORCE_END_NAMESPACE__
ssl_stream(const ssl_context &ctx)
从SSL上下文构造
NEFORCE_NODISCARD const string & last_error() const
获取最后错误信息
void set_sni_hostname(const string &hostname)
设置SNI主机名(客户端)
NEFORCE_NODISCARD bool is_valid() const noexcept
检查SSL对象是否有效
NEFORCE_NODISCARD bool verify_peer() const
验证对等方证书
ssize_t read(void *buffer, size_t size)
读取加密数据
bool write_all(const void *data, size_t size)
写入所有数据
NEFORCE_NODISCARD x509_ptr get_peer_certificate() const
获取对等方证书
NEFORCE_NODISCARD int pending() const
获取缓冲区中可读字节数
void set_fd(native_handle_type fd)
设置底层socket文件描述符
NEFORCE_NODISCARD::SSL * release() noexcept
释放SSL对象所有权
NEFORCE_NODISCARD string get_version() const
获取TLS协议版本
ssl_stream()=default
默认构造函数
void reset(const ssl_context &ctx)
重置SSL流
NEFORCE_NODISCARD string get_cipher_name() const
获取密码套件名称
NEFORCE_NODISCARD::SSL * native_handle() const noexcept
获取原生SSL对象指针
vector< char > read_all(size_t max_size=8192)
读取所有可用数据
ssize_t write(const void *buffer, size_t size)
写入加密数据
int native_handle_type
原生文件描述符类型
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针