c++ - 使用 asio 和 c++ 异步接受 ssl 套接字
问题描述
我正在尝试使用带有 SSL 加密套接字的 asio 编写异步服务器。目前我有不使用 SSL 的代码,在遵循本教程之后,我对如何接受 SSL 套接字有了基本的了解,但是我不知道如何调整这段代码以接受 SSL 连接:
void waitForClients() {
acceptor.async_accept(
[this](std::error_code ec, asio::ip::tcp::socket socket) {
if (!ec) {
Conn newConn = std::make_shared<Connection>(ctx, std::move(socket));
connections.push_back(newConn);
} else {
std::cerr << "[SERVER] New connection error: " << ec.message() << "\n";
}
waitForClients();
}
);
}
//this is how the tutorial shows to accept a connection
ssl_socket socket(io_context, ssl_context);
acceptor.accept(socket.next_layer());
问题是回调acceptor.async_accept
给出了一个普通的asio::ip::tcp::socket
而不是一个asio::ssl::ssl_socket<asio::ip::tcp::socket>
,我找不到任何文档表明存在一种async_accept
以这种方式创建 SSL 套接字的方法。我见过的唯一方法是先构造一个套接字,然后再接受它,这不能以这种异步方式完成。
任何帮助将非常感激。
解决方案
我通过意识到构造函数的第二个参数asio::ssl::stream<asio::ip::tcp::socket>
是底层类型的任何asio::ip::tcp::socket
初始化程序来解决了这个问题。因此可以解决问题:
void waitForClients() {
acceptor.async_accept(
[this](std::error_code ec, asio::ip::tcp::socket socket) {
if (!ec) {
//initialise an ssl stream from already created socket
asio::ssl::stream<asio::ip::tcp::socket> sslStream(sslCtx, std::move(socket);
//then pass it on to be used
Conn newConn = std::make_shared<Connection>(ctx, sslStream);
connections.push_back(newConn);
} else {
std::cerr << "[SERVER] New connection error: " << ec.message() << "\n";
}
waitForClients();
}
);
}
推荐阅读
- r - 根据日期将数据框拆分为行
- r - 根据 R 中的一个列元素名称在数据框的其他列中创建一个元素
- jenkins - 管道脚本詹金斯
- sql-server - 获取链接服务器上对象的信息
- mongodb - 连接到具有 x509 证书的实例后,如何从 docker 中的 mongo shell 运行命令?
- sql - 列出 Teradata 中 temp / volatile 表中的列
- visual-c++ - 仅来自项目目录的 Visual Studio c++ 警告
- javascript - 如何连接两个选项和切换开关按钮
- machine-learning - K 最近邻分类器 - 训练测试拆分的随机状态导致不同的准确度分数
- r - ggplot2 图例 2 行