NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
neforce::ssl_socket类 参考final

SSL/TLS安全Socket类 更多...

#include <ssl_socket.hpp>

类 neforce::ssl_socket 继承关系图:
[图例]

Public 成员函数

 ssl_socket ()=default
 默认构造函数
 ssl_socket (const native_handle_type fd)
 从原生句柄构造
 ssl_socket (tcp_socket sock)
 从TCP socket转移构造
 ~ssl_socket () override=default
 析构函数
void init_server_ssl (const ssl_context &ctx)
 初始化服务器端SSL
void init_client_ssl (const ssl_context &ctx, const string &hostname="")
 初始化客户端端SSL
string peer_certificate_info () const
 获取对等方证书信息
string get_alpn_negotiated () const
 获取ALPN协商的协议名称
ssize_t send (memory_view< const char > data, int flags=0) override
 发送加密数据
ssize_t receive (memory_view< char > buffer, int flags=0) override
 接收解密数据
bool close () noexcept override
 关闭SSL连接和底层socket
bool is_ssl () const noexcept override
 检查是否为SSL/TLS socket
ssl_streamssl ()
 获取SSL流对象的引用
const ssl_streamssl () const
 获取SSL流对象的常量引用
Public 成员函数 继承自 neforce::tcp_socket
 tcp_socket ()=default
 默认构造函数
 tcp_socket (tcp_socket &&)=default
 移动构造函数
tcp_socketoperator= (tcp_socket &&)=default
 移动赋值运算符
 tcp_socket (native_handle_type fd)
 从原生句柄构造
 ~tcp_socket () override=default
 析构函数
void open (family f=family::INET4)
 打开TCP socket
bool connect (const ip_address &endpoint, milliseconds timeout, bool was_blocking=true)
 连接到远程服务器
ssize_t send (memory_view< const char > data, milliseconds timeout, int flags=0)
 带超时的发送数据
void send_all (memory_view< const char > data)
 发送所有数据
vector< char > receive_all (size_t expected_size)
 接收指定大小的所有数据
void async_connect (io_context &ctx, const ip_address &endpoint, function< void(error_code)> handler)
 异步连接到远程端点
void async_connect (io_context &ctx, const ip_address &endpoint, cancellation_slot &slot, function< void(error_code)> handler)
 异步连接(带取消槽)
void async_read (io_context &ctx, memory_view< char > buffer, function< void(error_code, size_t)> handler) override
 异步读取数据
void async_read (io_context &ctx, memory_view< char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler) override
 异步读取(带取消槽)
void async_write (io_context &ctx, memory_view< const char > buffer, function< void(error_code, size_t)> handler) override
 异步写入数据
void async_write (io_context &ctx, memory_view< const char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler) override
 异步写入(带取消槽)
void async_receive (io_context &ctx, memory_view< char > buffer, function< void(error_code, size_t)> handler)
 异步接收(转发到 async_read)
void async_receive (io_context &ctx, memory_view< char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler)
 异步接收(带取消槽,转发到 async_read)
void async_send (io_context &ctx, memory_view< const char > buffer, function< void(error_code, size_t)> handler)
 异步发送(转发到 async_write)
void async_send (io_context &ctx, memory_view< const char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler)
 异步发送(带取消槽,转发到 async_write)
template<typename Token, enable_if_t<!is_same_v< decay_t< Token >, function< void(error_code, size_t)> >, int > = 0>
decltype(auto) async_receive (io_context &ctx, memory_view< char > buffer, Token &&token)
 异步接收—模板令牌版本(转发到 async_read)
template<typename Token, enable_if_t<!is_same_v< decay_t< Token >, function< void(error_code, size_t)> >, int > = 0>
decltype(auto) async_send (io_context &ctx, memory_view< const char > buffer, Token &&token)
 异步发送—模板令牌版本(转发到 async_write)
template<typename Token, enable_if_t<!is_same_v< decay_t< Token >, function< void(error_code)> >, int > = 0>
void async_connect (io_context &ctx, const ip_address &endpoint, Token &&token)
 异步连接—任意可调用对象版本
auto async_connect (io_context &ctx, const ip_address &endpoint, use_future_t)
 异步连接—use_future
void async_connect (io_context &ctx, const ip_address &endpoint, detached_t)
 异步连接—detached(即发即忘)
auto async_connect (io_context &ctx, const ip_address &endpoint, use_awaitable_t)
 异步连接—use_awaitable
Public 成员函数 继承自 neforce::ip_socket
 ip_socket ()=default
 默认构造函数
 ip_socket (const native_handle_type fd) noexcept
 从原生句柄构造
 ~ip_socket () override=default
 析构函数
family address_family () const noexcept
 获取地址族
bool is_ipv4 () const noexcept
 检查是否为IPv4 socket
bool is_ipv6 () const noexcept
 检查是否为IPv6 socket
virtual void connect (const ip_address &endpoint)
 连接到远程端点(TCP客户端)
Public 成员函数 继承自 neforce::socket_base
 socket_base ()
 默认构造函数
 socket_base (const native_handle_type fd) noexcept
 从原生句柄构造
 socket_base (socket_base &&other) noexcept
 移动构造函数
socket_baseoperator= (socket_base &&other) noexcept
 移动赋值运算符
virtual ~socket_base ()
 析构函数
native_handle_type native_handle () const noexcept
 获取原生句柄
bool is_open () const noexcept
 检查socket是否已打开
 operator bool () const noexcept
 布尔转换运算符
void open (family f, type t=type::STREAM, protocol p=protocol::AUTO)
 打开socket
bool try_open (family f, type t=type::STREAM, protocol p=protocol::AUTO) noexcept
 尝试打开socket
bool is_nonblocking () const noexcept
 查询是否为非阻塞模式
bool set_nonblocking (bool enable) noexcept
 设置非阻塞模式
bool shutdown_send () noexcept
 关闭发送方向
bool shutdown_receive () noexcept
 关闭接收方向
bool shutdown_both () noexcept
 关闭双向通信
bool set_option (int level, int optname, const void *value, ::socklen_t len) noexcept
 设置socket选项
bool get_option (int level, int optname, void *optval, ::socklen_t *optlen) const noexcept
 获取socket选项
bool get_reuse_address () const noexcept
 查询地址重用
bool set_reuse_address (bool enable=true) noexcept
 设置地址重用
bool get_reuse_port () const noexcept
 查询端口重用
bool set_reuse_port (bool enable=true) noexcept
 设置端口重用
bool get_keep_alive () const noexcept
 查询TCP KeepAlive
bool set_keep_alive (bool enable=true) noexcept
 设置TCP KeepAlive
bool get_tcp_nodelay () const noexcept
 查询Nagle算法
bool set_tcp_nodelay (bool enable=true) noexcept
 设置禁用Nagle算法
int get_receive_buffer_size () const noexcept
 查询接收缓冲区大小
bool set_receive_buffer_size (int size) noexcept
 设置接收缓冲区大小
int get_send_buffer_size () const noexcept
 查询发送缓冲区大小
bool set_send_buffer_size (int size) noexcept
 设置发送缓冲区大小
optional< millisecondsget_send_timeout () const noexcept
 获取发送超时时间
bool set_send_timeout (milliseconds timeout) noexcept
 设置发送超时时间
optional< millisecondsget_receive_timeout () const noexcept
 获取接收超时时间
bool set_receive_timeout (milliseconds timeout) noexcept
 设置接收超时时间
optional< ip_addresslocal_endpoint () const
 获取本地端点地址
optional< ip_addressremote_endpoint () const
 获取远程端点地址
void bind (const ip_address &endpoint)
 绑定socket到本地地址
void listen (int backlog)
 开始监听连接(TCP)
native_handle_type release () noexcept
 释放socket所有权
Public 成员函数 继承自 neforce::async_stream
virtual ~async_stream ()=default
 析构函数
template<typename Token, enable_if_t<!is_same_v< decay_t< Token >, function< void(error_code, size_t)> >, int > = 0>
void async_read (io_context &ctx, memory_view< char > buffer, Token &&token)
 异步读取—任意可调用对象
auto async_read (io_context &ctx, memory_view< char > buffer, use_future_t)
 异步读取—use_future
void async_read (io_context &ctx, memory_view< char > buffer, detached_t)
 异步读取—detached(即发即忘)
auto async_read (io_context &ctx, memory_view< char > buffer, use_awaitable_t)
 异步读取—use_awaitable
template<typename Token, enable_if_t<!is_same_v< decay_t< Token >, function< void(error_code, size_t)> >, int > = 0>
void async_write (io_context &ctx, memory_view< const char > buffer, Token &&token)
 异步写入—任意可调用对象
auto async_write (io_context &ctx, memory_view< const char > buffer, use_future_t)
 异步写入—use_future
void async_write (io_context &ctx, memory_view< const char > buffer, detached_t)
 异步写入—detached(即发即忘)
auto async_write (io_context &ctx, memory_view< const char > buffer, use_awaitable_t)
 异步写入—use_awaitable
void async_read (io_context &ctx, mutable_buffers &bufs, function< void(error_code, size_t)> handler)
 异步读取—scatter-gather
void async_write (io_context &ctx, const_buffers &bufs, function< void(error_code, size_t)> handler)
 异步写入—scatter-gather
void async_read (io_context &ctx, dynamic_buffer &buf, size_t n, function< void(error_code, size_t)> handler)
 异步读取到 dynamic_buffer

额外继承的成员函数

Public 类型 继承自 neforce::socket_base
enum class  type : int32_t {
  STREAM = SOCK_STREAM , DGRAM = SOCK_DGRAM , RAW = SOCK_RAW , RDM = SOCK_RDM ,
  SEQPACKET = SOCK_SEQPACKET , CLOEXEC = SOCK_CLOEXEC , NONBLOCK = SOCK_NONBLOCK , DCCP = SOCK_DCCP
}
 socket 类型枚举 更多...
enum class  protocol : int32_t {
  AUTO = 0 , ICMP = IPPROTO_ICMP , TCP = IPPROTO_TCP , UDP = IPPROTO_UDP ,
  SCTP = IPPROTO_SCTP , RAW = IPPROTO_RAW , ESP = IPPROTO_ESP , AH = IPPROTO_AH ,
  DCCP = IPPROTO_DCCP , IP = ETH_P_IP , ARP = ETH_P_ARP , IPV6 = ETH_P_IPV6 ,
  LAT = ETH_P_LAT , VLAN = ETH_P_8021Q , LLDP = ETH_P_LLDP , MPLS = ETH_P_MPLS_UC
}
 socket 协议枚举 更多...
using native_handle_type
 平台原生句柄类型
using family = ip_address::family
 网络地址族类型
静态 Public 属性 继承自 neforce::socket_base
static constexpr native_handle_type invalid_handle
 无效句柄常量
Protected 属性 继承自 neforce::ip_socket
family family_ = family::UNDEF
 地址族
Protected 属性 继承自 neforce::socket_base
native_handle_type fd_ = invalid_handle
 Socket句柄
bool nonblocking_ {false}
 非阻塞模式状态跟踪

详细描述

SSL/TLS安全Socket类

实现SSL/TLS加密的TCP socket,提供安全的网络通信。 继承自tcp_socket,可以透明地替换普通TCP socket。

主要功能:

  • SSL/TLS客户端初始化
  • SSL/TLS服务器端初始化
  • 加密数据发送和接收
  • 对等方证书信息获取
  • 无缝透明替换TCP socket

使用示例:

ctx.load_verify_locations("ca-bundle.crt");
ssl_socket client;
client.open(AF_INET);
auto server = ip_address::parse("example.com", ports::https);
client.connect(*server, milliseconds(3000));
client.init_client_ssl(ctx, "example.com");
// 发送HTTPS请求
string request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
client.send_all(request.view());
// 接收响应
char buffer[4096];
ssize_t received = client.receive({buffer, sizeof(buffer)});
if (received > 0) {
println(string_view(buffer, received));
}
// 获取证书信息
// SSL服务器示例
ssl_context server_ctx(ssl_method::TLS_SERVER);
server_ctx.load_certificate("server.crt", "server.key");
ssl_acceptor acceptor;
acceptor.open(ip_address::any(ports::https));
auto client_sock = acceptor.accept_ssl();
client_sock.set_ssl_context(server_ctx);
// 与客户端进行加密通信
constexpr view_type view() const noexcept
获取字符串视图
static optional< ip_address > parse(const string &host, ports port=ports{}) noexcept
从字符串解析IP地址
static ip_address any(ports port=ports::UNDEF, family f=family::INET4) noexcept
获取通配地址
SSL/TLS上下文管理类
ssl_socket()=default
默认构造函数
ssize_t receive(memory_view< char > buffer, int flags=0) override
接收解密数据
string peer_certificate_info() const
获取对等方证书信息
void init_client_ssl(const ssl_context &ctx, const string &hostname="")
初始化客户端端SSL
void open(family f=family::INET4)
打开TCP socket
void send_all(memory_view< const char > data)
发送所有数据
bool connect(const ip_address &endpoint, milliseconds timeout, bool was_blocking=true)
连接到远程服务器
void println(Args &&... args)
打印多个值并换行
duration< int64_t, milli > milliseconds
毫秒持续时间
int64_t ssize_t
有符号大小类型
@ TLS_SERVER
TLS服务器端
@ TLS_CLIENT
TLS客户端端
basic_string_view< char > string_view
字符字符串视图

在文件 ssl_socket.hpp74 行定义.

构造及析构函数说明

◆ ssl_socket() [1/2]

neforce::ssl_socket::ssl_socket ( const native_handle_type fd)
inlineexplicit

从原生句柄构造

参数
fd原生socket句柄

在文件 ssl_socket.hpp88 行定义.

引用了 neforce::tcp_socket::tcp_socket().

◆ ssl_socket() [2/2]

neforce::ssl_socket::ssl_socket ( tcp_socket sock)
inlineexplicit

从TCP socket转移构造

参数
sockTCP socket对象

将普通TCP socket转换为SSL socket。 适用于接受连接后升级为TLS的场景。

在文件 ssl_socket.hpp98 行定义.

引用了 neforce::move() , 以及 neforce::tcp_socket::tcp_socket().

成员函数说明

◆ close()

bool neforce::ssl_socket::close ( )
overridevirtualnoexcept

关闭SSL连接和底层socket

先发送SSL关闭通知,再关闭底层TCP socket。

重载 neforce::ip_socket .

◆ get_alpn_negotiated()

string neforce::ssl_socket::get_alpn_negotiated ( ) const
nodiscard

获取ALPN协商的协议名称

返回
协议名称字符串(如"h2"、"http/1.1"),未协商返回空字符串

TLS握手完成后通过ALPN协商确定的应用层协议。 需要在init_server_ssl()或init_client_ssl()之后调用。

◆ init_client_ssl()

void neforce::ssl_socket::init_client_ssl ( const ssl_context & ctx,
const string & hostname = "" )

初始化客户端端SSL

参数
ctxSSL上下文(需已加载CA证书)
hostname服务器主机名(用于SNI和证书验证)
异常
ssl_exceptionSSL握手失败时抛出
value_exceptionsocket未打开时抛出

作为客户端发起SSL/TLS握手。需要在连接建立后调用。

◆ init_server_ssl()

void neforce::ssl_socket::init_server_ssl ( const ssl_context & ctx)

初始化服务器端SSL

参数
ctxSSL上下文(需已加载CA证书)
异常
ssl_exceptionSSL握手失败时抛出
value_exceptionsocket未打开时抛出

作为服务器端执行SSL/TLS握手。需要在连接建立后调用。

◆ is_ssl()

bool neforce::ssl_socket::is_ssl ( ) const
inlinenodiscardoverridevirtualnoexcept

检查是否为SSL/TLS socket

返回
始终返回true(SSL/TLS激活时)

重载 neforce::tcp_socket .

在文件 ssl_socket.hpp180 行定义.

引用了 is_ssl().

被这些函数引用 is_ssl().

◆ peer_certificate_info()

string neforce::ssl_socket::peer_certificate_info ( ) const
nodiscard

获取对等方证书信息

返回
证书信息字符串(主题和颁发者)

返回对等方证书的可读信息,用于调试和验证。

◆ receive()

ssize_t neforce::ssl_socket::receive ( memory_view< char > buffer,
int flags = 0 )
overridevirtual

接收解密数据

参数
buffer接收缓冲区
flags接收标志(忽略)
返回
实际接收的字节数
异常
ssl_exception接收失败时抛出

如果TLS已激活,通过ssl_stream接收解密数据;否则回退到普通接收。

重载 neforce::tcp_socket .

◆ send()

ssize_t neforce::ssl_socket::send ( memory_view< const char > data,
int flags = 0 )
overridevirtual

发送加密数据

参数
data要发送的数据
flags发送标志(忽略)
返回
实际发送的字节数
异常
ssl_exception发送失败时抛出

如果TLS已激活,通过ssl_stream发送加密数据;否则回退到普通发送。

重载 neforce::tcp_socket .

引用了 neforce::data().

◆ ssl() [1/2]

ssl_stream & neforce::ssl_socket::ssl ( )
inlinenodiscard

获取SSL流对象的引用

返回
SSL流引用
异常
ssl_exceptionSSL未初始化时抛出

在文件 ssl_socket.hpp187 行定义.

◆ ssl() [2/2]

const ssl_stream & neforce::ssl_socket::ssl ( ) const
inlinenodiscard

获取SSL流对象的常量引用

返回
SSL流常量引用
异常
ssl_exceptionSSL未初始化时抛出

在文件 ssl_socket.hpp199 行定义.


该类的文档由以下文件生成: