diff --git a/.gitignore b/.gitignore index 892b7bf6..36e9925a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ ws/.srl ixhttpd makefile a.out +.idea/ +cmake-build-debug/ diff --git a/docs/usage.md b/docs/usage.md index 57799be7..e7a77c75 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -445,6 +445,17 @@ server.wait(); ``` +### Heartbeat + +You can configure an optional heartbeat / keep-alive for the WebSocket server. The heartbeat interval can be adjusted or disabled when constructing the `WebSocketServer`. Setting the interval to `-1` disables the heartbeat feature; this is the default setting. The parameter you set will be applied to every `WebSocket` object that the server creates. + +To enable a 45 second heartbeat on a `WebSocketServer`: + +```cpp +int pingIntervalSeconds = 45; +ix::WebSocketServer server(port, host, backlog, maxConnections, handshakeTimeoutSecs, addressFamily, pingIntervalSeconds); +``` + ## HTTP client API ```cpp diff --git a/ixwebsocket/IXWebSocketServer.cpp b/ixwebsocket/IXWebSocketServer.cpp index 4518389b..cb6988a5 100644 --- a/ixwebsocket/IXWebSocketServer.cpp +++ b/ixwebsocket/IXWebSocketServer.cpp @@ -19,17 +19,20 @@ namespace ix { const int WebSocketServer::kDefaultHandShakeTimeoutSecs(3); // 3 seconds const bool WebSocketServer::kDefaultEnablePong(true); + const int WebSocketServer::kPingIntervalSeconds(-1); // disable heartbeat WebSocketServer::WebSocketServer(int port, const std::string& host, int backlog, size_t maxConnections, int handshakeTimeoutSecs, - int addressFamily) + int addressFamily, + int pingIntervalSeconds) : SocketServer(port, host, backlog, maxConnections, addressFamily) , _handshakeTimeoutSecs(handshakeTimeoutSecs) , _enablePong(kDefaultEnablePong) , _enablePerMessageDeflate(true) + , _pingIntervalSeconds(pingIntervalSeconds) { } @@ -93,6 +96,7 @@ namespace ix auto webSocket = std::make_shared(); webSocket->setAutoThreadName(false); + webSocket->setPingInterval(_pingIntervalSeconds); if (_onConnectionCallback) { diff --git a/ixwebsocket/IXWebSocketServer.h b/ixwebsocket/IXWebSocketServer.h index dcb21e81..7636074e 100644 --- a/ixwebsocket/IXWebSocketServer.h +++ b/ixwebsocket/IXWebSocketServer.h @@ -33,7 +33,8 @@ namespace ix int backlog = SocketServer::kDefaultTcpBacklog, size_t maxConnections = SocketServer::kDefaultMaxConnections, int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs, - int addressFamily = SocketServer::kDefaultAddressFamily); + int addressFamily = SocketServer::kDefaultAddressFamily, + int pingIntervalSeconds = WebSocketServer::kPingIntervalSeconds); virtual ~WebSocketServer(); virtual void stop() final; @@ -61,6 +62,7 @@ namespace ix int _handshakeTimeoutSecs; bool _enablePong; bool _enablePerMessageDeflate; + int _pingIntervalSeconds; OnConnectionCallback _onConnectionCallback; OnClientMessageCallback _onClientMessageCallback; @@ -69,6 +71,7 @@ namespace ix std::set> _clients; const static bool kDefaultEnablePong; + const static int kPingIntervalSeconds; // Methods virtual void handleConnection(std::unique_ptr socket,