diff --git a/src/WebSocket.h b/src/WebSocket.h index 39ca0b2..a7e6aaa 100644 --- a/src/WebSocket.h +++ b/src/WebSocket.h @@ -167,10 +167,14 @@ public: } } - /* Emit close event */ WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); + + /* Set shorter timeout (use ping-timeout) to avoid long hanging sockets after end() on broken connections */ + Super::timeout(webSocketContextData->idleTimeoutComponents.second); + + /* Emit close event */ if (webSocketContextData->closeHandler) { webSocketContextData->closeHandler(this, code, message); } diff --git a/src/WebSocketContext.h b/src/WebSocketContext.h index 84625a4..6a14a07 100644 --- a/src/WebSocketContext.h +++ b/src/WebSocketContext.h @@ -364,7 +364,7 @@ private: auto *webSocketData = (WebSocketData *)(us_socket_ext(SSL, s)); auto *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, us_socket_context(SSL, (us_socket_t *) s)); - if (webSocketContextData->sendPingsAutomatically && !webSocketData->hasTimedOut) { + if (webSocketContextData->sendPingsAutomatically && !webSocketData->isShuttingDown && !webSocketData->hasTimedOut) { webSocketData->hasTimedOut = true; us_socket_timeout(SSL, s, webSocketContextData->idleTimeoutComponents.second); /* Send ping without being corked */ diff --git a/src/WebSocketContextData.h b/src/WebSocketContextData.h index d0da1d9..a14ba0c 100644 --- a/src/WebSocketContextData.h +++ b/src/WebSocketContextData.h @@ -88,13 +88,9 @@ public: while ((int) idleTimeout - margin * 2 >= margin * 2 && margin < 16) { margin = (unsigned short) (margin << 1); } - /* We should have no margin if not using sendPingsAutomatically */ - if (!sendPingsAutomatically) { - margin = 0; - } idleTimeoutComponents = { - idleTimeout - margin, - margin + idleTimeout - (sendPingsAutomatically ? margin : 0), /* reduce normal idleTimeout if it is extended by ping-timeout */ + margin /* ping-timeout - also used for end() timeout */ }; }