From 6ac3bdb94ada23609577c7761e6e7e4b576876a6 Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Thu, 3 Jan 2019 17:05:44 -0800 Subject: [PATCH] implement a max connections (default = 32) settings --- ixwebsocket/IXWebSocketServer.cpp | 25 ++++++++++++++++++++++++- ixwebsocket/IXWebSocketServer.h | 11 ++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ixwebsocket/IXWebSocketServer.cpp b/ixwebsocket/IXWebSocketServer.cpp index 549b03e0..3b56fd02 100644 --- a/ixwebsocket/IXWebSocketServer.cpp +++ b/ixwebsocket/IXWebSocketServer.cpp @@ -23,11 +23,16 @@ namespace ix const int WebSocketServer::kDefaultPort(8080); const std::string WebSocketServer::kDefaultHost("127.0.0.1"); const int WebSocketServer::kDefaultTcpBacklog(5); + const size_t WebSocketServer::kDefaultMaxConnections(32); - WebSocketServer::WebSocketServer(int port, const std::string& host, int backlog) : + WebSocketServer::WebSocketServer(int port, + const std::string& host, + int backlog, + size_t maxConnections) : _port(port), _host(host), _backlog(backlog), + _maxConnections(maxConnections), _stop(false) { @@ -194,6 +199,19 @@ namespace ix continue; } + if (getConnectedClientsCount() >= _maxConnections) + { + std::stringstream ss; + ss << "WebSocketServer::run() reached max connections = " + << _maxConnections << ". " + << "Not accepting connection"; + logError(ss.str()); + + ::close(clientFd); + + continue; + } + // Launch the handleConnection work asynchronously in its own thread. // // the destructor of a future returned by std::async blocks, @@ -252,4 +270,9 @@ namespace ix std::lock_guard lock(_clientsMutex); return _clients; } + + size_t WebSocketServer::getConnectedClientsCount() + { + return getClients().size(); + } } diff --git a/ixwebsocket/IXWebSocketServer.h b/ixwebsocket/IXWebSocketServer.h index f3be5063..be3c4f34 100644 --- a/ixwebsocket/IXWebSocketServer.h +++ b/ixwebsocket/IXWebSocketServer.h @@ -4,6 +4,11 @@ * Copyright (c) 2018 Machine Zone, Inc. All rights reserved. */ +// TODO +// pass to callback PATH +// pass connection success too to callback +// + #pragma once #include // pair @@ -25,7 +30,8 @@ namespace ix public: WebSocketServer(int port = WebSocketServer::kDefaultPort, const std::string& host = WebSocketServer::kDefaultHost, - int backlog = WebSocketServer::kDefaultTcpBacklog); + int backlog = WebSocketServer::kDefaultTcpBacklog, + size_t maxConnections = WebSocketServer::kDefaultMaxConnections); virtual ~WebSocketServer(); void setOnConnectionCallback(const OnConnectionCallback& callback); @@ -43,6 +49,7 @@ namespace ix int _port; std::string _host; int _backlog; + size_t _maxConnections; OnConnectionCallback _onConnectionCallback; @@ -63,10 +70,12 @@ namespace ix const static int kDefaultPort; const static std::string kDefaultHost; const static int kDefaultTcpBacklog; + const static size_t kDefaultMaxConnections; // Methods void run(); void handleConnection(int fd); + size_t getConnectedClientsCount(); // Logging void logError(const std::string& str);