私はこの質問に答えるのに遅れていますが、これが他の人に役立つことを願っています。サムの答えにはアイデアの虫が含まれていますが、私の意見では十分に遠ざかりません。
このアイデアは、asioがSSLソケットをストリーム内にラップするという考えから来ています。このすべての解決策は、非SSLソケットを同様にラップすることです。
SSLソケットと非SSLソケットの間に一様な外部インターフェイスがあるという望ましい結果は、3つのクラスで行われます。一方のベースは、実質的にインターフェイスを定義します。
class Socket {
public:
virtual boost::asio::ip::tcp::socket &getSocketForAsio() = 0;
static Socket* create(boost::asio::io_service& iIoService, boost::asio::ssl::context *ipSslContext) {
// Obviously this has to be in a separate source file since it makes reference to subclasses
if (ipSslContext == nullptr) {
return new NonSslSocket(iIoService);
}
return new SslSocket(iIoService, *ipSslContext);
}
size_t _read(void *ipData, size_t iLength) {
return boost::asio::read(getSocketForAsio(), boost::asio::buffer(ipData, iLength));
}
size_t _write(const void *ipData, size_t iLength) {
return boost::asio::write(getSocketForAsio(), boost::asio::buffer(ipData, iLength));
}
};
2つのサブクラスがSSLソケットと非SSLソケットをラップします。
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SslSocket_t;
class SslSocket: public Socket, private SslSocket_t {
public:
SslSocket(boost::asio::io_service& iIoService, boost::asio::ssl::context &iSslContext) :
SslSocket_t(iIoService, iSslContext) {
}
private:
boost::asio::ip::tcp::socket &getSocketForAsio() {
return next_layer();
}
};
と
class NonSslSocket: public Socket, private Socket_t {
public:
NonSslSocket(boost::asio::io_service& iIoService) :
Socket_t(iIoService) {
}
private:
boost::asio::ip::tcp::socket &getSocketForAsio() {
return next_layer();
}
};
あなたがgetSocketForAsio()を使用ASIO関数を呼び出すのではなく、Socketオブジェクトへの参照を渡すたびに。例:
boost::asio::async_read(pSocket->getSocketForAsio(),
boost::asio::buffer(&buffer, sizeof(buffer)),
boost::bind(&Connection::handleRead,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
ソケットがポインタとして格納されていることに注意してください。多形性がどのように隠されているのか、私は考えられません。
ペナルティは、非SSLソケットを取得するために使用される余分な間接レベルです。
最初のアプローチは、私がやってしまったものですが、私は抽象クラスのアイデアのように実行します。
この関数は、通常のTCP ::ソケットとも安全なSSLソケットで作業を動作します。私はそれを見てみましょう - ありがとう。 – DSB