implement a max connections (default = 32) settings

This commit is contained in:
Benjamin Sergeant 2019-01-03 17:05:44 -08:00
parent e964a0a1f0
commit 6ac3bdb94a
2 changed files with 34 additions and 2 deletions

View File

@ -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();
}
}

View File

@ -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);