#include "asio_service.h"
#include <iostream>
{
public:
protected:
{
std::cout <<
"Chat SSL session with Id " <<
id() <<
" connected!" << std::endl;
}
{
std::cout <<
"Chat SSL session with Id " <<
id() <<
" handshaked!" << std::endl;
std::string message("Hello from SSL chat! Please send a message or '!' to disconnect the client!");
}
{
std::cout <<
"Chat SSL session with Id " <<
id() <<
" disconnected!" << std::endl;
}
void onReceived(
const void* buffer,
size_t size)
override
{
std::string message((const char*)buffer, size);
std::cout << "Incoming: " << message << std::endl;
if (message == "!")
}
void onError(
int error,
const std::string& category,
const std::string& message)
override
{
std::cout << "Chat SSL session caught an error with code " << error << " and category '" << category << "': " << message << std::endl;
}
};
{
public:
protected:
std::shared_ptr<CppServer::Asio::SSLSession>
CreateSession(
const std::shared_ptr<CppServer::Asio::SSLServer>& server)
override
{
return std::make_shared<ChatSession>(server);
}
protected:
void onError(
int error,
const std::string& category,
const std::string& message)
override
{
std::cout << "Chat TCP server caught an error with code " << error << " and category '" << category << "': " << message << std::endl;
}
};
int main(int argc, char** argv)
{
int port = 2222;
if (argc > 1)
port = std::atoi(argv[1]);
std::cout << "SSL server port: " << port << std::endl;
std::cout << std::endl;
auto service = std::make_shared<AsioService>();
std::cout << "Asio service starting...";
service->Start();
std::cout << "Done!" << std::endl;
auto context = std::make_shared<CppServer::Asio::SSLContext>(asio::ssl::context::tlsv13);
context->set_password_callback([](size_t max_length, asio::ssl::context::password_purpose purpose) -> std::string { return "qwerty"; });
context->use_certificate_chain_file("../tools/certificates/server.pem");
context->use_private_key_file("../tools/certificates/server.pem", asio::ssl::context::pem);
context->use_tmp_dh_file("../tools/certificates/dh4096.pem");
auto server = std::make_shared<ChatServer>(service, context, port);
std::cout << "Server starting...";
server->Start();
std::cout << "Done!" << std::endl;
std::cout << "Press Enter to stop the server or '!' to restart the server..." << std::endl;
std::string line;
while (getline(std::cin, line))
{
if (line.empty())
break;
if (line == "!")
{
std::cout << "Server restarting...";
server->Restart();
std::cout << "Done!" << std::endl;
continue;
}
line = "(admin) " + line;
server->Multicast(line);
}
std::cout << "Server stopping...";
server->Stop();
std::cout << "Done!" << std::endl;
std::cout << "Asio service stopping...";
service->Stop();
std::cout << "Done!" << std::endl;
return 0;
}
virtual void onError(int error, const std::string &category, const std::string &message)
Handle error notification.
SSLServer(const std::shared_ptr< Service > &service, const std::shared_ptr< SSLContext > &context, int port, InternetProtocol protocol=InternetProtocol::IPv4)
Initialize SSL server with a given Asio service, SSL context and port number.
virtual std::shared_ptr< SSLSession > CreateSession(const std::shared_ptr< SSLServer > &server)
Create SSL session factory method.
virtual bool SendAsync(const void *buffer, size_t size)
Send data to the client (asynchronous)
const CppCommon::UUID & id() const noexcept
Get the session Id.
virtual bool Disconnect()
Disconnect the session.
virtual void onConnected()
Handle session connected notification.
virtual void onReceived(const void *buffer, size_t size)
Handle buffer received notification.
std::shared_ptr< SSLServer > & server() noexcept
Get the server.
SSLSession(const std::shared_ptr< SSLServer > &server)
Initialize the session with a given server.
virtual void onError(int error, const std::string &category, const std::string &message)
Handle error notification.
virtual void onHandshaked()
Handle session handshaked notification.
virtual void onDisconnected()
Handle session disconnected notification.