/*! \file piclientserver_server.h * \ingroup ClientServer * \~\brief * \~english TCP server and client factory for the %ClientServer module * \~russian TCP-сервер и фабрика клиентов для модуля %ClientServer */ /* PIP - Platform Independent Primitives Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef piclientserver_server_H #define piclientserver_server_H #include "pimutex.h" #include "pinetworkaddress.h" #include "pip_client_server_export.h" #include "pistreampacker.h" #include "pithreadnotifier.h" class PIEthernet; class PIThread; namespace PIClientServer { class ServerClient; //! \ingroup ClientServer //! \~\brief //! \~english TCP server that accepts connections and manages %ServerClient objects. //! \~russian TCP-сервер, принимающий соединения и управляющий объектами %ServerClient. class PIP_CLIENT_SERVER_EXPORT Server: public PIStreamPackerConfig { friend class ServerClient; NO_COPY_CLASS(Server); public: //! \~english Constructs a stopped server with default limits. //! \~russian Создает остановленный сервер с ограничениями по умолчанию. Server(); //! \~english Stops the server and releases transport resources. //! \~russian Останавливает сервер и освобождает транспортные ресурсы. virtual ~Server(); //! \~english Starts listening for clients on address "addr". //! \~russian Начинает принимать клиентов по адресу "addr". void listen(PINetworkAddress addr); //! \~english Starts listening on all interfaces at port "port". //! \~russian Начинает прослушивание на всех интерфейсах на порту "port". void listenAll(ushort port) { listen({0, port}); } //! \~english Stops accepting clients and shuts the server down. //! \~russian Прекращает прием клиентов и завершает работу сервера. void stopServer(); //! \~english Closes all currently connected clients. //! \~russian Закрывает все текущие клиентские соединения. void closeAll(); //! \~english Returns the configured maximum number of simultaneous clients. //! \~russian Возвращает настроенный максимум одновременных клиентов. int getMaxClients() const { return max_clients; } //! \~english Sets the maximum number of simultaneous clients. //! \~russian Устанавливает максимальное число одновременных клиентов. void setMaxClients(int new_max_clients); //! \~english Returns the number of currently connected clients. //! \~russian Возвращает текущее количество подключенных клиентов. int clientsCount() const; //! \~english Calls "func" for each currently connected client. //! \~russian Вызывает "func" для каждого текущего подключенного клиента. void forEachClient(std::function func); //! \~english Sets the factory used to create accepted client objects. //! \~russian Устанавливает фабрику, создающую объекты принятых клиентов. void setClientFactory(std::function f) { client_factory = f; } private: void newClient(ServerClient * c); void clientDisconnected(ServerClient * c); std::function client_factory; std::atomic_bool is_closing = {false}; PIEthernet * tcp_server = nullptr; PIThread * clean_thread = nullptr; PIThreadNotifier clean_notifier; PIVector clients; mutable PIMutex clients_mutex; int max_clients = 1000; }; } // namespace PIClientServer #endif