/*! \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