8000 fix server disconnect problems · coderGods/arduinoWebSockets@5c2c257 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5c2c257

Browse files
committed
fix server disconnect problems
1 parent 57e30e0 commit 5c2c257

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

src/WebSockets.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,10 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
282282
* @param size
283283
*/
284284
bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) {
285+
if(!client->tcp || !client->tcp->connected()) {
286+
return false;
287+
}
288+
285289
if(size > WEBSOCKETS_MAX_HEADER_SIZE) {
286290
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d to big!\n", client->num, size);
287291
return false;
@@ -309,6 +313,10 @@ bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) {
309313

310314
void WebSockets::handleWebsocketCb(WSclient_t * client) {
311315

316+
if(!client->tcp || !client->tcp->connected()) {
317+
return;
318+
}
319+
312320
uint8_t * buffer = client->cWsHeader;
313321

314322
WSMessageHeader_t * header = &client->cWsHeaderDecode;
@@ -390,6 +398,7 @@ void WebSockets::handleWebsocketCb(WSclient_t * client) {
390398
}
391< 8000 /td>399

392400
void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) {
401+
393402
WSMessageHeader_t * header = &client->cWsHeaderDecode;
394403
if(ok) {
395404
if(header->payloadLen > 0) {
@@ -513,6 +522,9 @@ String WebSockets::base64_encode(uint8_t * data, size_t length) {
513522
*/
514523
bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) {
515524
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
525+
if(!client->tcp || !client->tcp->connected()) {
526+
return false;
527+
}
516528

517529
client->tcp->readBytes(out, n, std::bind([](WSclient_t * client, bool ok, WSreadWaitCb cb) {
518530
if(cb) {

src/WebSockets.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
#include <Arduino.h>
2929

30-
//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ )
30+
#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ )
3131

3232
#ifndef DEBUG_WEBSOCKETS
3333
#define DEBUG_WEBSOCKETS(...)

src/WebSocketsClient.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String f
8989
* called in arduino loop
9090
*/
9191
void WebSocketsClient::loop(void) {
92+
#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
9293
if(!clientIsConnected(&_client)) {
9394

9495
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
@@ -146,10 +147,9 @@ void WebSocketsClient::loop(void) {
146147
delay(10); //some little delay to not flood the server
147148
}
148149
} else {
149-
#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
150150
handleClientData();
151-
#endif
152151
}
152+
#endif
153153
}
154154

155155
/**
@@ -269,11 +269,17 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) {
269269

270270
if(client->tcp) {
271271
if(client->tcp->connected()) {
272+
#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
272273
client->tcp->flush();
274+
#endif
273275
client->tcp->stop();
274276
}
275277
event = true;
278+
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
279+
client->status = WSC_NOT_CONNECTED;
280+
#else
276281
delete client->tcp;
282+
#endif
277283
client->tcp = NULL;
278284
}
279285

src/WebSocketsServer.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) {
296296

297297
// state is not connected or tcp connection is lost
298298
if(!clientIsConnected(client)) {
299+
299300
client->tcp = TCPclient;
300301

301302
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
@@ -316,6 +317,18 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) {
316317

317318

318319
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
320+
client->tcp->onDisconnect(std::bind([](WebSocketsServer * server, AsyncTCPbuffer * obj, WSclient_t * client) -> bool {
321+
DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num);
322+
323+
AsyncTCPbuffer ** sl = &server->_clients[client->num].tcp;
324+
if(*sl == obj) {
325+
client->status = WSC_NOT_CONNECTED;
326+
*sl = NULL;
327+
}
328+
return true;
329+
}, this, std::placeholders::_1, client));
330+
331+
319332
client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine)));
320333
#endif
321334

@@ -375,7 +388,11 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) {
375388
#endif
376389
client->tcp->stop();
377390
}
391+
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
392+
client->status = WSC_NOT_CONNECTED;
393+
#else
378394
delete client->tcp;
395+
#endif
379396
client->tcp = NULL;
380397
}
381398

@@ -425,6 +442,7 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) {
425442

426443
if(client->tcp) {
427444
// do cleanup
445+
DEBUG_WEBSOCKETS("[WS-Server][%d] client list cleanup.\n", client->num);
428446
clientDisconnect(client);
429447
}
430448

0 commit comments

Comments
 (0)
0