diff --git a/src/WebSockets.cpp b/src/WebSockets.cpp index b3ad336..ce4017b 100644 --- a/src/WebSockets.cpp +++ b/src/WebSockets.cpp @@ -254,7 +254,11 @@ void WebSockets::handleWebsocket(WSclient_t * client) { } if(mask) { - client->tcp.read(maskKey, 4); + if(!readWait(client, maskKey, 4)) { + //timeout + clientDisconnect(client, 1002); + return; + } } if(payloadLen > 0) { diff --git a/src/WebSockets.h b/src/WebSockets.h index b52f135..44a8c6e 100644 --- a/src/WebSockets.h +++ b/src/WebSockets.h @@ -44,7 +44,7 @@ #endif #define WEBSOCKETS_MAX_DATA_SIZE (15*1024) -#define WEBSOCKETS_TCP_TIMEOUT (1000) +#define WEBSOCKETS_TCP_TIMEOUT (1500) typedef enum { WSC_NOT_CONNECTED, diff --git a/src/WebSocketsClient.cpp b/src/WebSocketsClient.cpp index dac1308..210bd6b 100644 --- a/src/WebSocketsClient.cpp +++ b/src/WebSocketsClient.cpp @@ -218,13 +218,17 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) { */ bool WebSocketsClient::clientIsConnected(WSclient_t * client) { - if(client->status != WSC_NOT_CONNECTED && client->tcp.connected()) { - return true; - } - - if(client->status != WSC_NOT_CONNECTED) { - // cleanup - clientDisconnect(&_client); + if(client->tcp.connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Client] connection lost.\n"); + // do cleanup + clientDisconnect(client); + } } return false; } diff --git a/src/WebSocketsServer.cpp b/src/WebSocketsServer.cpp index 0982b35..f8ca998 100644 --- a/src/WebSocketsServer.cpp +++ b/src/WebSocketsServer.cpp @@ -302,13 +302,17 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) { */ bool WebSocketsServer::clientIsConnected(WSclient_t * client) { - if(client->status != WSC_NOT_CONNECTED && client->tcp.connected()) { - return true; - } - - if(client->status != WSC_NOT_CONNECTED) { - // cleanup - clientDisconnect(client); + if(client->tcp.connected()) { + if(client->status != WSC_NOT_CONNECTED) { + return true; + } + } else { + // client lost + if(client->status != WSC_NOT_CONNECTED) { + DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num); + // do cleanup + clientDisconnect(client); + } } return false; }