boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::shutdown() 做什么?

What does boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::shutdown() do?

本文关键字:boost asio shutdown 什么 ip stream ssl lt tcp socket gt      更新时间:2023-10-16

广泛的文档很有帮助地说:

此函数用于关闭流上的 SSL。函数调用将阻塞,直到 SSL 关闭或发生错误。

这给我留下了这些问题:

  1. 这是否也会关闭实际连接?
  2. 如果没有,我该怎么做?
  3. 我可以通过再次调用boost::asio::connect(theSocket.lowest_layer(), ...来重复使用流吗?

在幕后,asio 调用底层 OpenSSL 库中的SSL_Shutdown()

其文档在这里:

https://www.openssl.org/docs/manmaster/ssl/SSL_shutdown.html

。并包含以下不祥的文本:

SSL_shutdown(( 的行为还取决于底层 BIO。

然而,我对事物的理解是,ssl::stream对象不是套接字(设计使然(,而更像是位于类似Stream对象的协议层。因此asio::ssl层不知道它next_layer(),除了它必须支持自由函数readwriteasync_readasync_write。当然不知道该层是否支持shutdown()(甚至close()(的概念。

因此,我希望lowest_layer()给出的基础套接字在返回时shutdown()仍然打开。此外,我希望shutdown()不会被召唤到lowest_layer().您需要在ssl::shutdown返回后或在传递给ssl::async_shutdown的处理程序中执行此操作