From cfebf8cf23e49f44ad82357a0ee3324c578293d4 Mon Sep 17 00:00:00 2001 From: andrey Date: Wed, 26 Aug 2020 17:28:56 +0300 Subject: [PATCH] cloud test --- libs/cloud/picloudserver.cpp | 24 ++++++++---- libs/main/cloud/picloudserver.h | 7 +++- libs/main/io_devices/piethernet.cpp | 3 +- main.cpp | 19 +++++---- utils/cloud_dispatcher/cloudserver.cpp | 5 +++ utils/cloud_dispatcher/cloudserver.h | 12 ++++++ utils/cloud_dispatcher/dispatcherclient.cpp | 8 ++++ utils/cloud_dispatcher/dispatcherclient.h | 8 +++- utils/cloud_dispatcher/dispatcherserver.cpp | 43 ++++++++++++++++----- utils/cloud_dispatcher/dispatcherserver.h | 10 ++++- utils/cloud_dispatcher/main.cpp | 3 ++ 11 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 utils/cloud_dispatcher/cloudserver.cpp create mode 100644 utils/cloud_dispatcher/cloudserver.h diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index a6210e9b..2bef35f7 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -18,11 +18,9 @@ */ #include "picloudserver.h" -#include "piethernet.h" -PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) : PIIODevice(path, mode) { - eth = new PIEthernet(PIEthernet::TCP_Client); +PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) : PIIODevice(path, mode), eth(PIEthernet::TCP_Client) { } @@ -33,18 +31,28 @@ PICloudServer::~PICloudServer() { bool PICloudServer::openDevice() { piCout << "PICloudServer open device" << path(); - bool op = eth->connect(path(), false); + bool op = eth.connect(path(), false); if (op) { - CONNECTL(eth, disconnected, [this](bool){eth->connect(path());}); - eth->startThreadedRead(); return true; + } else { + eth.close(); } return false; } bool PICloudServer::closeDevice() { - eth->stopThreadedRead(); - return eth->close(); + return eth.close(); } + +int PICloudServer::readDevice(void * read_to, int max_size) { + return eth.read(read_to, max_size); +} + + +int PICloudServer::writeDevice(const void * data, int max_size) { + return eth.write(data, max_size); +} + + diff --git a/libs/main/cloud/picloudserver.h b/libs/main/cloud/picloudserver.h index b91bf398..a7e3da2a 100644 --- a/libs/main/cloud/picloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -24,7 +24,7 @@ #define PICLOUDSERVER_H #include "pip_cloud_export.h" -#include "piiodevice.h" +#include "piethernet.h" class PIEthernet; @@ -40,9 +40,12 @@ public: protected: bool openDevice(); bool closeDevice(); + int readDevice(void * read_to, int max_size); + int writeDevice(const void * data, int max_size); private: - PIEthernet * eth; + PIEthernet eth; + }; #endif // PICLOUDSERVER_H diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 6f44cfff..2867b069 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -564,8 +564,9 @@ bool PIEthernet::connect(bool threaded) { PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_); #endif connected_ = (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) == 0); - if (!connected_) + if (!connected_) { piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString(); + } opened_ = connected_; if (connected_) { connecting_ = false; diff --git a/main.cpp b/main.cpp index d1442618..a69c28d7 100644 --- a/main.cpp +++ b/main.cpp @@ -2,13 +2,16 @@ int main() { PICloudServer s("127.0.0.1:10101"); - for (int i=0; i<3; ++i) { - s.open(); - piCout() << "opened"; - piSleep(1); - s.close(); - piCout() << "closed"; - piSleep(1); - } +// for (int i=0; i<3; ++i) { +// s.open(); +// piCout << "opened"; +// piSleep(10); +// s.close(); +// piCout << "closed"; +// piSleep(1); +// } +// s.open(); + s.startThreadedRead(); + piSleep(200); return 0; } diff --git a/utils/cloud_dispatcher/cloudserver.cpp b/utils/cloud_dispatcher/cloudserver.cpp new file mode 100644 index 00000000..3a7afcba --- /dev/null +++ b/utils/cloud_dispatcher/cloudserver.cpp @@ -0,0 +1,5 @@ +#include "cloudserver.h" + +CloudServer::CloudServer(DispatcherClient * client) { + +} diff --git a/utils/cloud_dispatcher/cloudserver.h b/utils/cloud_dispatcher/cloudserver.h new file mode 100644 index 00000000..b3b6f3ff --- /dev/null +++ b/utils/cloud_dispatcher/cloudserver.h @@ -0,0 +1,12 @@ +#ifndef CLOUDSERVER_H +#define CLOUDSERVER_H + +#include "dispatcherclient.h" + +class CloudServer +{ +public: + CloudServer(DispatcherClient * client); +}; + +#endif // CLOUDSERVER_H diff --git a/utils/cloud_dispatcher/dispatcherclient.cpp b/utils/cloud_dispatcher/dispatcherclient.cpp index 83f3c02e..7991d353 100644 --- a/utils/cloud_dispatcher/dispatcherclient.cpp +++ b/utils/cloud_dispatcher/dispatcherclient.cpp @@ -3,14 +3,22 @@ DispatcherClient::DispatcherClient(PIEthernet * eth_) { eth = eth_; + CONNECTU(&disconnect_tm, tickEvent, eth, close); eth->startThreadedRead(); CONNECTU(eth, threadedReadEvent, this, readed); CONNECTU(eth, disconnected, this, disconnected); piCoutObj << "client connected" << eth->sendAddress(); + disconnect_tm.start(10000); } DispatcherClient::~DispatcherClient() { +// delete eth; +} + + +PIString DispatcherClient::address() { + return eth->path(); } diff --git a/utils/cloud_dispatcher/dispatcherclient.h b/utils/cloud_dispatcher/dispatcherclient.h index aa0e0c6f..00dbbfaf 100644 --- a/utils/cloud_dispatcher/dispatcherclient.h +++ b/utils/cloud_dispatcher/dispatcherclient.h @@ -9,12 +9,16 @@ class DispatcherClient: public PIObject { public: DispatcherClient(PIEthernet * eth_); ~DispatcherClient(); - EVENT_HANDLER2(void, readed, uchar * , data, int, size); - EVENT_HANDLER1(void, disconnected, bool, withError); EVENT1(disconnectEvent, DispatcherClient *, client) + EVENT2(registerServer, PIString, sname, DispatcherClient *, client) + PIString address(); private: + EVENT_HANDLER2(void, readed, uchar * , data, int, size); + EVENT_HANDLER1(void, disconnected, bool, withError); + PIEthernet * eth; + PITimer disconnect_tm; }; diff --git a/utils/cloud_dispatcher/dispatcherserver.cpp b/utils/cloud_dispatcher/dispatcherserver.cpp index 40959cbf..99bdd045 100644 --- a/utils/cloud_dispatcher/dispatcherserver.cpp +++ b/utils/cloud_dispatcher/dispatcherserver.cpp @@ -1,32 +1,57 @@ #include "dispatcherserver.h" -DispatcherServer::DispatcherServer(PIEthernet::Address addr) { - eth = new PIEthernet(PIEthernet::TCP_Server); - eth->setParameter(PIEthernet::ReuseAddress); - CONNECTU(eth, newConnection, this, newConnection); - eth->listen(addr, true); - piCoutObj << eth << "server started" << addr; +DispatcherServer::DispatcherServer(PIEthernet::Address addr) : eth(PIEthernet::TCP_Server) { + eth.setParameter(PIEthernet::ReuseAddress); + CONNECTU(ð, newConnection, this, newConnection); + eth.listen(addr, true); + piCoutObj << "server started" << addr; + CONNECTU(&status_timer, tickEvent, this, printStatus); + status_timer.start(1000); } DispatcherServer::~DispatcherServer() { - eth->close(); + eth.close(); piCoutObj << "server stoped"; - delete eth; +} + + +void DispatcherServer::printStatus() { + map_mutex.lock(); + piCout << PICoutManipulators::NewLine; + piCout << "Connections:"; + for (auto c: clients) { + piCout << " " << c->address(); + } + piCout << "Servers:"; + auto it = c_servers.makeIterator(); + while(it.next()){ + piCout << " " << it.key(); + } + map_mutex.unlock(); } void DispatcherServer::disconnectClient(DispatcherClient *client) { piCoutObj << "remove client" << client; + map_mutex.lock(); clients.removeOne(client); + map_mutex.unlock(); delete client; } void DispatcherServer::newConnection(PIEthernet *cl) { DispatcherClient * client = new DispatcherClient(cl); - piCoutObj << "add client" << client; CONNECTU(client, disconnectEvent, this, disconnectClient); + CONNECTL(client, registerServer, [this](PIString sname, DispatcherClient * c){ + map_mutex.lock(); + c_servers.insert(sname, new CloudServer(c)); + map_mutex.unlock(); + }); + piCoutObj << "add client" << client; + map_mutex.lock(); clients.push_back(client); + map_mutex.unlock(); } diff --git a/utils/cloud_dispatcher/dispatcherserver.h b/utils/cloud_dispatcher/dispatcherserver.h index 4edf2c23..a7205686 100644 --- a/utils/cloud_dispatcher/dispatcherserver.h +++ b/utils/cloud_dispatcher/dispatcherserver.h @@ -2,6 +2,7 @@ #define DISPATCHERSERVER_H #include "dispatcherclient.h" +#include "cloudserver.h" class DispatcherServer: public PIObject { @@ -9,12 +10,17 @@ class DispatcherServer: public PIObject { public: DispatcherServer(PIEthernet::Address addr); ~DispatcherServer(); + EVENT_HANDLER0(void, printStatus); + +private: EVENT_HANDLER1(void, newConnection, PIEthernet * , cl); EVENT_HANDLER1(void, disconnectClient, DispatcherClient *, client); -private: - PIEthernet * eth; + PIEthernet eth; PIVector clients; + PIMap c_servers; + PITimer status_timer; + PIMutex map_mutex; }; #endif // DISPATCHERSERVER_H diff --git a/utils/cloud_dispatcher/main.cpp b/utils/cloud_dispatcher/main.cpp index 6a685a3d..0fcf610a 100644 --- a/utils/cloud_dispatcher/main.cpp +++ b/utils/cloud_dispatcher/main.cpp @@ -53,6 +53,9 @@ int main (int argc, char * argv[]) { if (cli.hasArgument("port")) addr.setPort(cli.argumentValue("port").toInt()); DispatcherServer server(addr); + PIKbdListener ls; + ls.enableExitCapture(PIKbdListener::F10); + ls.start(); WAIT_FOR_EXIT return 0; }