diff --git a/utils/cloud_dispatcher/cloudserver.cpp b/utils/cloud_dispatcher/cloudserver.cpp index 61666916..7ae55555 100644 --- a/utils/cloud_dispatcher/cloudserver.cpp +++ b/utils/cloud_dispatcher/cloudserver.cpp @@ -3,14 +3,14 @@ CloudServer::CloudServer(DispatcherClient * c, const PIByteArray & sname): server(c) { setName(sname.toHex()); server_uuid = sname; - CONNECTL(c, dataReadedServer, ([this](uint id, PIByteArray & ba) { - last_ping.reset(); - mutex_clients.lock(); - DispatcherClient * cl = index_clients.value(id, nullptr); - mutex_clients.unlock(); - if (cl) cl->sendData(ba); - })); - CONNECTL(c, pingReceived, [this]() { last_ping.reset(); }); + connects << CONNECTL(c, dataReadedServer, ([this](uint id, PIByteArray & ba) { + last_ping.reset(); + mutex_clients.lock(); + DispatcherClient * cl = index_clients.value(id, nullptr); + mutex_clients.unlock(); + if (cl) cl->sendData(ba); + })); + connects << CONNECTL(c, pingReceived, [this]() { last_ping.reset(); }); last_ping.reset(); } @@ -19,6 +19,8 @@ CloudServer::~CloudServer() { for (auto c: clients) { c->close(); } + for (auto & c: connects) + c.disconnect(); } @@ -70,6 +72,11 @@ void CloudServer::close() { } +void CloudServer::stop() { + server->stop(); +} + + void CloudServer::printStatus() { PIMutexLocker locker(mutex_clients); piCout << " " diff --git a/utils/cloud_dispatcher/cloudserver.h b/utils/cloud_dispatcher/cloudserver.h index 6ddead69..20b00441 100644 --- a/utils/cloud_dispatcher/cloudserver.h +++ b/utils/cloud_dispatcher/cloudserver.h @@ -18,8 +18,10 @@ public: const DispatcherClient * getConnection() const { return server; } double lastPing(); void close(); + void stop(); private: + PIVector connects; DispatcherClient * server; PIVector clients; PIMap index_clients; diff --git a/utils/cloud_dispatcher/dispatcherclient.cpp b/utils/cloud_dispatcher/dispatcherclient.cpp index 6fba09b0..8fa09715 100644 --- a/utils/cloud_dispatcher/dispatcherclient.cpp +++ b/utils/cloud_dispatcher/dispatcherclient.cpp @@ -36,6 +36,11 @@ void DispatcherClient::close() { } +void DispatcherClient::stop() { + eth->stop(); +} + + void DispatcherClient::sendConnected(uint client_id) { piCoutObj << "sendConnected" << client_id; tcp.sendConnected(client_id); diff --git a/utils/cloud_dispatcher/dispatcherclient.h b/utils/cloud_dispatcher/dispatcherclient.h index 1a2f25cb..7c315187 100644 --- a/utils/cloud_dispatcher/dispatcherclient.h +++ b/utils/cloud_dispatcher/dispatcherclient.h @@ -14,6 +14,7 @@ public: ~DispatcherClient(); void start(); void close(); + void stop(); void sendConnected(uint client_id); void sendDisconnected(uint client_id); void sendData(const PIByteArray & data); diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index 68ad4ca0..90503e19 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -196,15 +196,13 @@ void DispatcherServer::disconnectClient(DispatcherClient * client) { CloudServer * cs = index_c_servers.value(client, nullptr); if (cs) { piCoutObj << "remove Server" << client->clientId(); + cs->stop(); PIVector cscv = cs->getClients(); for (auto csc: cscv) { clients.removeAll(csc); index_c_clients.remove(csc); - cs->removeClient(csc); - csc->close(); if (!rmrf_clients.contains(csc)) rmrf_clients << csc; } - cs->close(); c_servers.remove(cs->serverUUID()); index_c_servers.remove(client); delete cs;