Hi,
Relevant code is bold.
Thanks,
j.c.
/**
* A TLS connection base class.
*/
class tls_connection_base
{
public:
/**
* Constructor
* @param ios
*/
tls_connection_base(io_service_t & ios)
: timer_(ios)
, context_(ios, ssl_context_t::tlsv1_client)
, socket_(ios, context_)
{
context_.set_verify_mode(ssl_context_t::verify_peer);
try
{
context_.load_verify_file("ca.pem");
}
catch (...)
{
std::cout << "tls_connection_base::tls_connection_base: " <<
"failed to load certificate file!" <<
std::endl;
}
}
/**
* Virtual Destructor
*/
virtual ~tls_connection_base()
{
// ...
}
/**
* Performs an asyncronous connect to desired endpoint.
* @param endpoint The endpoint to connect to.
*/
void async_connect(const stream_endpoint_t & endpoint)
{
endpoint_ = endpoint;
socket_.lowest_layer().async_connect(endpoint,
boost::bind(&tls_connection_base::handle_connect, this,
boost::asio::placeholders::error)
);
timer_.expires_from_now(boost::posix_time::seconds(15));
timer_.async_wait(boost::bind(
&tls_connection_base::handle_timeout, this)
);
}
void handle_connect(const error_code_t & error)
{
if (!error)
{
socket_.async_handshake(boost::asio::ssl::stream_base::client,
boost::bind(&tls_connection_base::handle_handshake, this,
boost::asio::placeholders::error)
);
std::cout << "tls_connection_base::handle_connect: " <<
"Successful connection: local_endpoint(" <<
socket_.lowest_layer().local_endpoint() <<
")" <<
std::endl;
}
else
{
std::cout << "tls_connection_base::handle_connect: " <<
"Connect error: " << error.message() <<
std::endl;
}
}
void handle_handshake(const error_code_t & error)
{
if (!error)
{
std::cout << "tls_connection_base::handle_handshake: " <<
"Handshake success: " <<
std::endl;
}
else
{
std::cout << "tls_connection_base::handle_handshake: " <<
"Handshake failed: " << error.message() <<
std::endl;
}
}
void handle_timeout()
{
std::cout << "tls_connection_base::handle_timeout: " <<
"Connection timed out! " <<
std::endl;
socket_.lowest_layer().close();
// If we try to re-connect here, which is fired by a asio::deadline_timer
// we get caught up in a loop.
// How do we do an async_connect here without it going haywire?
async_connect.(endpoint_);
}
private:
deadline_timer_t timer_;
ssl_context_t context_;
tls_socket_t socket_;
stream_endpoint_t endpoint_;
};