首页 > 解决方案 > 使用 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 套接字的方法。我见过的唯一方法是先构造一个套接字,然后再接受它,这不能以这种异步方式完成。

任何帮助将非常感激。

标签: c++sslasynchronousboost-asioasio

解决方案


我通过意识到构造函数的第二个参数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();
        }
    );
}

推荐阅读