/
isachkov
/
crypto_server
Обзор
Документация
Войти
/
isachkov
/
crypto_server
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/client_session.cpp
77 строк
2 KB
Ivan Sachkov
CryptoServer
15 май 2024, 20:26
15 май 2024, 20:26
9de0f1f
Код
Авторство
О чём код?
#include <crypto_chat/client_session.hpp> #include <sys/socket.h> #include <iostream> #include <sstream> ClientSession::ClientSession(Descriptor desc, SSLProvider& provider) : socket_(desc), secure_layer_{provider.make_ssl_instance()} { secure_layer_.on_decrypted([this](auto buffer) { dispatch_message(std::move(buffer)); }); secure_layer_.on_encrypted([this](auto buffer) { auto send_size = send(socket_, buffer.data(), buffer.size(), 0); }); } void ClientSession::receive(std::vector<uint8_t> data) { secure_layer_.receive(std::move(data)); } void ClientSession::dispatch_message(std::vector<uint8_t> data) { switch (state_) { case ClientSessionState::Created: receive_name(std::move(data)); state_ = ClientSessionState::LoggedIn; break; case ClientSessionState::LoggedIn: receive_message(std::move(data)); break; } } void ClientSession::write(const std::string& message) { // Make it pooled in a real system, don't waste good memory pages std::vector<uint8_t> data{message.begin(), message.end()}; // Send data to the client, but encode it first secure_layer_.send(std::move(data)); } void ClientSession::on_broadcast(OnBroadcast handle) { on_broadcast_ = std::move(handle); } bool ClientSession::init() { return secure_layer_.init(true); } void ClientSession::receive_name(std::vector<uint8_t> data) { user_name_ = std::string(data.begin(), data.begin() + data.size() - 1); std::cout << "User has joined> " << user_name_ << std::endl; const auto greeting = user_name_ + " has joined the chat!\n"; if (on_broadcast_) { on_broadcast_(greeting); } write("Wellcome to the CryptoChat, " + user_name_ + "!\n"); } void ClientSession::receive_message(std::vector<uint8_t> data) { // You may implement any sophisticated logic here, like history, filtering, etc. // But for illustration purposes we simply add a name and send it back. std::stringstream stream; stream << user_name_ << ": "; stream << std::string(data.begin(), data.end()); const auto message = stream.str(); std::cout << "Message received> " << message; if (on_broadcast_) { on_broadcast_(message); } }