나는이 질문에 대답하기가 다소 늦었지만, 다른 사람들에게 도움이되기를 바랍니다. 샘의 대답은 아이디어의 세균을 포함하고 있지만 제 의견으로는 그만 두지는 않습니다.
이 아이디어는 asio가 스트림에서 SSL 소켓을 래핑한다는 관찰로부터 나온 것입니다. 이 모든 해결책은 비 SSL 소켓을 비슷하게 감싸는 것입니다.
SSL 소켓과 비 SSL 소켓간에 균일 한 외부 인터페이스를 갖는 결과는 세 가지 클래스로 수행됩니다. 하나는 기본으로 인터페이스를 효과적으로 정의합니다.
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));
}
};
두 개의 하위 클래스가 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();
}
};
당신은 ASIO 기능) getSocketForAsio를 (사용보다는 소켓 객체에 대한 참조를 전달 호출 할 때마다. 예 :
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