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

时间:2016-02-08 16:21:59

标签: c++ boost boost-asio

广泛的documentation有用地说:

  

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

这让我想到了这些问题:

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

1 个答案:

答案 0 :(得分:2)

在幕后,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的处理程序中执行此操作