feat: max clients connected limit in TcpServer

This commit is contained in:
MihailRis 2025-10-05 22:52:55 +03:00
parent 2f15a1a8d4
commit 2895cff5f2
4 changed files with 37 additions and 8 deletions

View File

@ -164,15 +164,16 @@ void Network::update() {
}
++socketiter;
}
auto serveriter = servers.begin();
while (serveriter != servers.end()) {
auto server = serveriter->second.get();
if (!server->isOpen()) {
serveriter = servers.erase(serveriter);
continue;
}
++serveriter;
}
auto serveriter = servers.begin();
while (serveriter != servers.end()) {
auto server = serveriter->second.get();
if (!server->isOpen()) {
serveriter = servers.erase(serveriter);
continue;
}
server->update();
++serveriter;
}
}

View File

@ -37,6 +37,8 @@ namespace network {
[[nodiscard]] TransportType getTransportType() const noexcept override {
return TransportType::TCP;
}
virtual void setMaxClientsConnected(int count) = 0;
};
class UdpServer : public Server {

View File

@ -304,6 +304,7 @@ class SocketTcpServer : public TcpServer {
bool open = true;
std::unique_ptr<std::thread> thread = nullptr;
int port;
int maxConnected = -1;
public:
SocketTcpServer(u64id_t id, Network* network, SOCKET descriptor, int port)
: id(id), network(network), descriptor(descriptor), port(port) {}
@ -312,6 +313,22 @@ public:
closeSocket();
}
void setMaxClientsConnected(int count) override {
maxConnected = count;
}
void update() override {
std::vector<u64id_t> clients;
for (u64id_t cid : this->clients) {
if (auto client = network->getConnection(cid, true)) {
if (client->getState() != ConnectionState::CLOSED) {
clients.emplace_back(cid);
}
}
}
std::swap(clients, this->clients);
}
void startListen(ConnectCallback handler) override {
thread = std::make_unique<std::thread>([this, handler]() {
while (open) {
@ -328,6 +345,11 @@ public:
close();
break;
}
if (maxConnected >= 0 && clients.size() >= maxConnected) {
logger.info() << "refused connection attempt from " << to_string(address);
closesocket(clientDescriptor);
continue;
}
logger.info() << "client connected: " << to_string(address);
auto socket = std::make_shared<SocketTcpConnection>(
clientDescriptor, address
@ -575,6 +597,8 @@ public:
SocketUdpServer::close();
}
void update() override {}
void startListen(ServerDatagramCallback handler) override {
callback = std::move(handler);

View File

@ -78,6 +78,8 @@ namespace network {
class Server {
public:
virtual ~Server() = default;
virtual void update() = 0;
virtual void close() = 0;
virtual bool isOpen() = 0;
[[nodiscard]] virtual TransportType getTransportType() const noexcept = 0;