diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-13 13:30:44 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-10-13 13:30:44 +0200 |
| commit | d9587cfd27aa5ef26170ec1983b47f1e26dc8136 (patch) | |
| tree | 7982a93e7cc7e27a733e613aebfb796058deb57a | |
| parent | ad1a9858cd0d15b1090a0977098b98307875f07c (diff) | |
| download | cmix-d9587cfd27aa5ef26170ec1983b47f1e26dc8136.tar.gz cmix-d9587cfd27aa5ef26170ec1983b47f1e26dc8136.tar.bz2 cmix-d9587cfd27aa5ef26170ec1983b47f1e26dc8136.zip | |
Connecting client now have to send an id to each node.
| -rw-r--r-- | client/cmixclient.cpp | 1 | ||||
| -rw-r--r-- | libcmix-network/acceptor.cpp | 2 | ||||
| -rw-r--r-- | libcmix-protobuf/cmix.proto | 2 | ||||
| -rw-r--r-- | node/node.cpp | 37 | ||||
| -rw-r--r-- | node/node.hpp | 13 |
5 files changed, 37 insertions, 18 deletions
diff --git a/client/cmixclient.cpp b/client/cmixclient.cpp index 933ad0e..06994bf 100644 --- a/client/cmixclient.cpp +++ b/client/cmixclient.cpp @@ -20,6 +20,7 @@ void CMixClient::initialize_connections() { for(int i = 0; i < network_details.size(); ++i) { auto handler = [this, i]() mutable { cmix_proto::ImAClient imaclient; + imaclient.set_id("A"); BOOST_LOG_TRIVIAL(trace) << "sending imaclient to node: " << i; network_connections.at(i).async_send(imaclient); diff --git a/libcmix-network/acceptor.cpp b/libcmix-network/acceptor.cpp index ed640a1..896ed95 100644 --- a/libcmix-network/acceptor.cpp +++ b/libcmix-network/acceptor.cpp @@ -45,5 +45,3 @@ void Acceptor::start_accepting(std::shared_ptr<ssl::context> ctx, SSLAcceptHandl { accept_loop(acceptor, ctx, accept_handler); } - - diff --git a/libcmix-protobuf/cmix.proto b/libcmix-protobuf/cmix.proto index e098cdf..1074613 100644 --- a/libcmix-protobuf/cmix.proto +++ b/libcmix-protobuf/cmix.proto @@ -9,7 +9,7 @@ message ImANode { } message ImAClient { - + required string id = 1; } message Bye { diff --git a/node/node.cpp b/node/node.cpp index 1fd83c2..f06e389 100644 --- a/node/node.cpp +++ b/node/node.cpp @@ -18,6 +18,7 @@ Node::Node(ListenSettings const& listen_settings, NodeNetworkSettings network_se , api(get_implementation()) , keypair(api.create_key_pair()) , network_pub_key() +, shutting_down(false) { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -90,6 +91,13 @@ void Node::handle_initialization(const cmix_proto::Initialization& init) } } +void Node::send_bye() +{ + cmix_proto::Bye bye; + next_node.async_send(bye); + shutting_down = true; +} + void Node::handle_node_message(cmix_proto::CMixMessage message) { switch(message.contents_case()) { @@ -99,6 +107,12 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) } case cmix_proto::CMixMessage::ContentsCase::kBye: { prev_node.close(); + if (!shutting_down) { + send_bye(); + prev_node.receive([this](cmix_proto::CMixMessage message){ + handle_node_message(message); + }); + } return; } default: { @@ -110,14 +124,14 @@ void Node::handle_node_message(cmix_proto::CMixMessage message) }); } -void Node::handle_client_message(std::list<SenderReceiver>::iterator handle, cmix_proto::CMixMessage message) +void Node::handle_client_message(ClientMap::key_type handle, cmix_proto::CMixMessage message) { switch(message.contents_case()) { case cmix_proto::CMixMessage::ContentsCase::kKeyexchange: { BOOST_LOG_TRIVIAL(trace) << "Deriving shared key"; api.derive_shared_key(keypair, reinterpret_cast<uint8_t const*>(message.keyexchange().public_key().c_str()), true); - handle->receive([this, handle](cmix_proto::CMixMessage message){ + clients.at(handle).receive([this, handle](cmix_proto::CMixMessage message){ handle_client_message(handle, message); }); return; @@ -125,7 +139,7 @@ void Node::handle_client_message(std::list<SenderReceiver>::iterator handle, cmi case cmix_proto::CMixMessage::ContentsCase::kBye: { BOOST_LOG_TRIVIAL(trace) << "Handling bye"; - handle->close(); + clients.at(handle).close(); clients.erase(handle); return; @@ -134,7 +148,7 @@ void Node::handle_client_message(std::list<SenderReceiver>::iterator handle, cmi BOOST_LOG_TRIVIAL(error) << "handle_client_message: CMixMessage contains unknown contents."; } } - handle->close(); + clients.at(handle).close(); clients.erase(handle); } @@ -147,15 +161,16 @@ void Node::handle_imanode(std::list<Receiver>::iterator handle) { }); } -void Node::handle_imaclient(std::list<Receiver>::iterator handle) { +void Node::handle_imaclient(std::list<Receiver>::iterator handle, cmix_proto::ImAClient c) { BOOST_LOG_TRIVIAL(trace) << "Handling imaclient"; - std::list<SenderReceiver>::iterator it = clients.emplace(clients.end(), make_sender_receiver(std::move(*handle))); - it->on_done([this, it]{ - clients.erase(it); + std::string client_id = c.id(); + clients.emplace(c.id(), make_sender_receiver(std::move(*handle))); + clients.at(c.id()).on_done([this, client_id]{ + clients.erase(client_id); }); purgatory.erase(handle); - it->receive([this, it](cmix_proto::CMixMessage message) { - handle_client_message(it, message); + clients.at(c.id()).receive([this, client_id](cmix_proto::CMixMessage message) { + handle_client_message(client_id, message); }); } @@ -167,7 +182,7 @@ void Node::handle_message(std::list<ProtobufClient<Receive>>::iterator handle, c return; } case cmix_proto::CMixMessage::ContentsCase::kImaclient: { - handle_imaclient(handle); + handle_imaclient(handle, message.imaclient()); return; } default: { diff --git a/node/node.hpp b/node/node.hpp index 9f1f3a2..868c4b8 100644 --- a/node/node.hpp +++ b/node/node.hpp @@ -32,7 +32,9 @@ class Node boost::asio::io_service io_service; Server server; std::list<Receiver> purgatory; - std::list<SenderReceiver> clients; + + typedef std::map<std::string, SenderReceiver> ClientMap; + ClientMap clients; NodeNetworkSettings network_settings; @@ -43,6 +45,10 @@ class Node KeyPair keypair; std::vector<uint8_t> network_pub_key; + bool shutting_down; + + void send_bye(); + void accept_handler(boost::asio::ip::tcp::socket&& socket); void start_precomputation(); @@ -51,12 +57,11 @@ class Node void handle_initialization(cmix_proto::Initialization const& init); void handle_node_message(cmix_proto::CMixMessage message); - void handle_client_message(std::list<SenderReceiver>::iterator handle, cmix_proto::CMixMessage message); + void handle_client_message(ClientMap::key_type handle, cmix_proto::CMixMessage message); void handle_imanode(std::list<Receiver>::iterator handle); - void handle_imaclient(std::list<Receiver>::iterator handle); + void handle_imaclient(std::list<Receiver>::iterator handle, cmix_proto::ImAClient c); void handle_message(std::list<ProtobufClient<Receive>>::iterator handle, cmix_proto::CMixMessage message); - public: /*! |
