我有这些 typedef
typedef boost::asio::ip::tcp::socket TBoostSocket;
typedef boost::asio::ssl::stream<TBoostSocket> TSLLSocket;
typedef boost::shared_ptr<TBoostSocket> TSocket;
typedef boost::shared_ptr<TSLLSocket> TSecureSocket;
问题是我需要将安全套接字作为 TSocket 传递。从 TSecureSocket 到 TSocket 的直接转换会起作用吗?
简短的回答没有。因为boost::asio::ssl::stream<TBoostSocket>
包裹了插座。
还是有其他解决方案?根据端口,我将确保套接字安全,而在其他情况下,我不会只需要返回类型为 TSocket。
但是TSLLSocket
(或 boost::asio::ssl::stream 更确切地说)提供了一种从实例中检索套接字的方法:
const next_layer_type & next_layer() const;
http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/reference/ssl__stream/next_layer/overload1.html
其中next_layer_type
由以下 typedef 定义:
typedef boost::remove_reference< Stream >::type next_layer_type;
http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/reference/ssl__stream/next_layer_type.html
由于您使用它定义模板,TBoostSocket
因此您在调用next_layer()
或lowest_layer()
当然,这将返回一个引用而不是指针,并且该引用指向不属于您的实例。因此,您现在需要以某种方式将其包装在 shared_ptr 中,这可能并不容易,因为您不能允许将其删除。