Files
pip/libs/main/client_server/piclientserver_server.h
2025-08-14 14:07:52 +03:00

109 lines
3.5 KiB
C++

/*! \file piclientserver_server.h
* \ingroup ClientServer
* \~\brief
* \~english
* \~russian
*/
/*
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 <http://www.gnu.org/licenses/>.
*/
#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;
//! ~english TCP server for client-server communication
//! ~russian TCP сервер для клиент-серверного взаимодействия
class PIP_CLIENT_SERVER_EXPORT Server: public PIStreamPackerConfig {
friend class ServerClient;
NO_COPY_CLASS(Server);
public:
Server();
virtual ~Server();
//! ~english Starts listening on specified address
//! ~russian Начинает прослушивание на указанном адресе
void listen(PINetworkAddress addr);
//! ~english Starts listening on all interfaces
//! ~russian Начинает прослушивание на всех интерфейсах
void listenAll(ushort port) { listen({0, port}); }
//! ~english Stops the server
//! ~russian Останавливает сервер
void stopServer();
//! ~english Closes all client connections
//! ~russian Закрывает все клиентские соединения
void closeAll();
//! ~english Gets maximum allowed clients
//! ~russian Возвращает максимальное число клиентов
int getMaxClients() const { return max_clients; }
//! ~english Sets maximum allowed clients
//! ~russian Устанавливает максимальное число клиентов
void setMaxClients(int new_max_clients);
//! ~english Gets current clients count
//! ~russian Возвращает текущее количество клиентов
int clientsCount() const;
//! ~english Executes function for each connected client
//! ~russian Выполняет функцию для каждого подключённого клиента
void forEachClient(std::function<void(ServerClient *)> func);
//! ~english Sets factory for creating new client instances
//! ~russian Устанавливает фабрику для создания клиентских экземпляров
void setClientFactory(std::function<ServerClient *()> f) { client_factory = f; }
private:
void newClient(ServerClient * c);
void clientDisconnected(ServerClient * c);
std::function<ServerClient *()> client_factory;
std::atomic_bool is_closing = {false};
PIEthernet * tcp_server = nullptr;
PIThread * clean_thread = nullptr;
PIThreadNotifier clean_notifier;
PIVector<ServerClient *> clients;
mutable PIMutex clients_mutex;
int max_clients = 1000;
};
} // namespace PIClientServer
#endif