From 88c5130eccd06e63ffca732626c0fb59426743a7 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Wed, 5 Oct 2016 12:56:52 +0200 Subject: Seperates Nodes and Clients for incoming connections. Created a PrevNode class to reflect the seperation. Made Client movable. Added 2 empty protobuf message that declare what each connecting client is, sent when connected to a node. --- node/node.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 26 deletions(-) (limited to 'node/node.cpp') diff --git a/node/node.cpp b/node/node.cpp index fb5b875..c02e5e6 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -13,6 +13,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se , server(io_service, listen_settings, [this](boost::asio::ip::tcp::socket&& socket){accept_handler(std::move(socket));}) , clients() , network_settings(network_settings) +, prev_node(Client(tcp::socket(io_service))) , next_node(tcp::socket(io_service)) , api(get_curve25519_implementation()) , keypair(api.create_key_pair()) @@ -21,6 +22,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se GOOGLE_PROTOBUF_VERIFY_VERSION; auto on_connect = [this, network_settings](){ + next_node.send(cmix_proto::ImANode()); if(network_settings.is_first) { start_initialisation(); } @@ -39,16 +41,18 @@ void Node::run() { void Node::accept_handler(boost::asio::ip::tcp::socket&& socket) { - clients.emplace_back(std::move(socket)); + purgatory.emplace_back(std::move(socket)); - auto it = --clients.end(); - clients.back().on_done( + std::list::iterator it = --purgatory.end(); + purgatory.back().on_done( [this, it]() { - clients.erase(it); + purgatory.erase(it); } ); - it->receive(std::bind(&Node::handle_message, this, std::placeholders::_1)); + it->receive([this, it](std::vector const& message_buffer) { + handle_message(decltype(it)(it), message_buffer); + }); } void Node::start_initialisation() { @@ -58,27 +62,6 @@ void Node::start_initialisation() { next_node.send(init); } -void Node::handle_message(const std::vector& message_buffer) -{ - cmix_proto::CMixMessage message; - if(!message.ParseFromArray(message_buffer.data(), message_buffer.size())) { - BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage"; - clients.clear(); - io_service.stop(); - return; - } - - switch(message.contents_case()) { - case cmix_proto::CMixMessage::ContentsCase::kInitialization: { - handle_initialization(message.initialization()); - break; - } - default: { - BOOST_LOG_TRIVIAL(error) << "CMixMessage contains unknown contents."; - } - } -} - void Node::handle_initialization(const cmix_proto::Initialization& init) { if(network_settings.is_first) { @@ -114,6 +97,70 @@ void Node::handle_initialization(const cmix_proto::Initialization& init) } } +void Node::handle_message(const std::vector& message_buffer) +{ + cmix_proto::CMixMessage message; + if(!message.ParseFromArray(message_buffer.data(), message_buffer.size())) { + BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage"; + clients.clear(); + io_service.stop(); + return; + } + + switch(message.contents_case()) { + case cmix_proto::CMixMessage::ContentsCase::kInitialization: { + handle_initialization(message.initialization()); + break; + } + default: { + BOOST_LOG_TRIVIAL(error) << "CMixMessage contains unknown contents."; + } + } +} + +void Node::handle_imanode(std::list::iterator handle) { + handle->on_done([]{}); + prev_node = PrevNode(std::move(*handle)); + purgatory.erase(handle); + prev_node.receive([this](std::vector const& message_buffer){ + handle_message(message_buffer); + }); +} + +void Node::handle_imaclient(std::list::iterator handle) { + clients.emplace_back(std::move(*handle)); + std::list::iterator it = clients.end()--; + it->on_done([this, it]{ + clients.erase(it); + }); + purgatory.erase(handle); +} + +void Node::handle_message(std::list::iterator handle, const std::vector& message_buffer) +{ + cmix_proto::CMixMessage message; + if(!message.ParseFromArray(message_buffer.data(), message_buffer.size())) { + BOOST_LOG_TRIVIAL(error) << "Received something which was not a CMixMessage"; + clients.clear(); + io_service.stop(); + return; + } + + switch(message.contents_case()) { + case cmix_proto::CMixMessage::ContentsCase::kImanode: { + handle_imanode(handle); + break; + } + case cmix_proto::CMixMessage::ContentsCase::kImaclient: { + handle_imaclient(handle); + break; + } + default: { + BOOST_LOG_TRIVIAL(error) << "CMixMessage contains unknown contents."; + } + } +} + void Node::start_precomputation() { clients.clear(); io_service.stop(); -- cgit v1.2.3-70-g09d2