implement a max connections (default = 32) settings
This commit is contained in:
		@@ -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<std::mutex> lock(_clientsMutex);
 | 
			
		||||
        return _clients;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    size_t WebSocketServer::getConnectedClientsCount()
 | 
			
		||||
    {
 | 
			
		||||
        return getClients().size();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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 <utility> // 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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user