asio的ssl::stream 怎么接收已经握过手的系统描述符
时间: 2024-01-09 12:03:09 浏览: 34
在使用 ASIO 的 `ssl::stream` 接收已经握手的系统描述符时,需要使用 `async_handshake` 函数来完成 SSL 握手过程,而不是 `async_connect` 函数。
具体步骤如下:
1. 创建一个 `ssl::context` 对象,并设置 SSL 相关参数,例如证书、密钥、密码等。
2. 使用 `ssl::stream` 对象的 `lowest_layer()` 函数来获取底层的 TCP socket 描述符,并使用 `native_handle()` 函数将其转换为系统描述符。
3. 使用 `ssl::stream` 对象的 `async_handshake` 函数来完成 SSL 握手过程,其中第一个参数为 `boost::asio::ssl::stream_base::server` 或 `boost::asio::ssl::stream_base::client`,分别表示服务端和客户端。
4. 在 `async_handshake` 函数完成后,可以开始进行 SSL 加密通信,使用 `async_read` 和 `async_write` 函数来读取和写入数据。
下面是一个简单的示例代码:
```cpp
boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12);
ctx.load_verify_file("ca.pem");
boost::asio::ip::tcp::socket socket(io_context);
asio::ssl::stream<boost::asio::ip::tcp::socket&> ssl_socket(socket, ctx);
// 获取系统描述符
int native_socket = socket.native_handle();
// 使用 async_handshake 函数完成 SSL 握手
ssl_socket.async_handshake(boost::asio::ssl::stream_base::server,
[this](const boost::system::error_code& error) {
if (!error) {
// SSL 握手成功,可以开始进行加密通信了
do_read();
} else {
// 握手失败
std::cerr << "Error: " << error.message() << std::endl;
}
});
```
在上面的示例代码中,`do_read()` 函数是一个自定义的读取数据的函数,你需要根据具体需求来实现它。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)