diff --git a/libs/cloud/picloudclient.cpp b/libs/cloud/picloudclient.cpp index a1e4cf6b..9e9356a1 100644 --- a/libs/cloud/picloudclient.cpp +++ b/libs/cloud/picloudclient.cpp @@ -128,7 +128,7 @@ ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) { ssize_t PICloudClient::writeDevice(const void * data, ssize_t size) { - if (is_deleted) return -1; + if (is_deleted || !is_connected) return -1; piCoutObj << "writeDevice" << size; return tcp.sendData(PIByteArray(data, size)); } diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index 2c00d2f8..ea1ef273 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -25,10 +25,12 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) tcp.setRole(PICloud::TCP::Server); tcp.setServerName(server_name); setName("cloud_server__" + server_name); + is_deleted = false; eth.setReopenEnabled(false); CONNECT1(void, PIByteArray, &streampacker, packetReceiveEvent, this, _readed); CONNECTL(ð, connected, [this](){opened_ = true; piCoutObj << "connected" << ð tcp.sendStart();}); CONNECTL(ð, disconnected, [this](bool){ + if (is_deleted) return; piCoutObj << "disconnected" << ð for (auto c : clients_) { delete c; @@ -45,6 +47,7 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) PICloudServer::~PICloudServer() { piCoutObj << "~PICloudServer ..." << this; + is_deleted = true; stop(); close(); piCout << "wait"; @@ -94,6 +97,7 @@ bool PICloudServer::closeDevice() { ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) { + if (is_deleted) return -1; //piCoutObj << "readDevice"; if (!opened_) openDevice(); //else piMSleep(eth.readTimeout()); @@ -118,6 +122,7 @@ void PICloudServer::clientDisconnect(uint client_id) { int PICloudServer::sendData(const PIByteArray & data, uint client_id) { + if (!opened_) return -1; return tcp.sendData(data, client_id); } @@ -173,6 +178,7 @@ ssize_t PICloudServer::Client::readDevice(void * read_to, ssize_t max_size) { ssize_t PICloudServer::Client::writeDevice(const void * data, ssize_t size) { + if (!is_connected) return -1; return server->sendData(PIByteArray(data, size), client_id); } @@ -193,6 +199,7 @@ void PICloudServer::Client::pushBuffer(const PIByteArray & ba) { void PICloudServer::_readed(PIByteArray & ba) { + if (is_deleted) return; PIPair hdr = tcp.parseHeader(ba); if (hdr.second == tcp.role()) { switch (hdr.first) { @@ -222,8 +229,7 @@ void PICloudServer::_readed(PIByteArray & ba) { clients_mutex.unlock(); if (oc) { oc->stopAndWait(); - //oc->is_connected = false; - //oc->close(); + oc->is_connected = false; delete oc; } } break; diff --git a/libs/main/cloud/picloudserver.h b/libs/main/cloud/picloudserver.h index a0fca4bd..59f8509e 100644 --- a/libs/main/cloud/picloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -86,6 +86,7 @@ private: PIMap index_clients; PITimer ping_timer; mutable PIMutex clients_mutex; + std::atomic_bool is_deleted; }; #endif // PICLOUDSERVER_H diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 551529df..17afb0ce 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -764,8 +764,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) { return -1; } if (connected_) { + connected_ = false; + opened_ = false; piCoutObj << "Disconnect on read," << ethErrorString(); - opened_ = connected_ = false; closeSocket(sock); init(); disconnected(rs < 0); @@ -855,8 +856,10 @@ ssize_t PIEthernet::writeDevice(const void * data, ssize_t max_size) { } if (!connected_) return -1; auto disconnectFunc = [this](){ + if (!connected_) return; + connected_ = false; + opened_ = false; piCoutObj << "Disconnect on write," << ethErrorString(); - opened_ = connected_ = false; closeSocket(sock); init(); disconnected(true); diff --git a/main_picloud_test.cpp b/main_picloud_test.cpp index 208fd746..54171b88 100644 --- a/main_picloud_test.cpp +++ b/main_picloud_test.cpp @@ -11,7 +11,7 @@ int main(int argc, char * argv[]) { PICloudClient c("127.0.0.1:10101"); // c.setReopenEnabled(true); PICloudServer s("127.0.0.1:10101"); - PIVector clients; + auto clients = new PIVector(); CONNECTL(&tm, tickEvent, ([&](void *, int){ if (c.isConnected()) { PIString str = "ping"; @@ -19,7 +19,7 @@ int main(int argc, char * argv[]) { c.write(str.toByteArray()); } if (s.isThreadedRead()) { - for (auto cl : clients) { + for (auto cl : *clients) { if (cl->isOpened()) { PIString str = "ping_S"; piCout << "[Server] send to" << cl << ":" << str; @@ -40,7 +40,7 @@ int main(int argc, char * argv[]) { CONNECTL(&c, disconnected, ([](){piCout << "disconnected";})); CONNECTL(&s, newConnection, ([&](PICloudServer::Client * cl){ piCout << "[Server] new client:" << cl; - clients << cl; + clients->append(cl); CONNECTL(cl, threadedReadEvent, ([cl, &rnd](const uchar * readed, ssize_t size){ PIByteArray ba(readed, size); PIString str = PIString(ba); @@ -53,7 +53,7 @@ int main(int argc, char * argv[]) { CONNECTL(cl, closed, ([&clients, cl](){ piCout << "[Server] client closed ..." << cl; cl->stop(); - clients.removeAll(cl); + clients->removeAll(cl); piCout << "[Server] client closed ok" << cl; })); cl->startThreadedRead(); diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index e976fdd2..9a9b84bb 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -21,7 +21,7 @@ DispatcherServer::~DispatcherServer() { void DispatcherServer::start() { eth.listen(true); - timeout_timer.start(5000); + timeout_timer.start(2000); piCoutObj << "server started" << eth.readAddress(); }