mirror of
https://github.com/Links2004/arduinoWebSockets.git
synced 2025-07-15 00:06:30 +02:00
fix server disconnect problems
This commit is contained in:
@ -282,6 +282,10 @@ void WebSockets::handleWebsocket(WSclient_t * client) {
|
|||||||
* @param size
|
* @param size
|
||||||
*/
|
*/
|
||||||
bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) {
|
bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) {
|
||||||
|
if(!client->tcp || !client->tcp->connected()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if(size > WEBSOCKETS_MAX_HEADER_SIZE) {
|
if(size > WEBSOCKETS_MAX_HEADER_SIZE) {
|
||||||
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d to big!\n", client->num, size);
|
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocketWaitFor] size: %d to big!\n", client->num, size);
|
||||||
return false;
|
return false;
|
||||||
@ -309,6 +313,10 @@ bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) {
|
|||||||
|
|
||||||
void WebSockets::handleWebsocketCb(WSclient_t * client) {
|
void WebSockets::handleWebsocketCb(WSclient_t * client) {
|
||||||
|
|
||||||
|
if(!client->tcp || !client->tcp->connected()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t * buffer = client->cWsHeader;
|
uint8_t * buffer = client->cWsHeader;
|
||||||
|
|
||||||
WSMessageHeader_t * header = &client->cWsHeaderDecode;
|
WSMessageHeader_t * header = &client->cWsHeaderDecode;
|
||||||
@ -390,6 +398,7 @@ void WebSockets::handleWebsocketCb(WSclient_t * client) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) {
|
void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) {
|
||||||
|
|
||||||
WSMessageHeader_t * header = &client->cWsHeaderDecode;
|
WSMessageHeader_t * header = &client->cWsHeaderDecode;
|
||||||
if(ok) {
|
if(ok) {
|
||||||
if(header->payloadLen > 0) {
|
if(header->payloadLen > 0) {
|
||||||
@ -513,6 +522,9 @@ String WebSockets::base64_encode(uint8_t * data, size_t length) {
|
|||||||
*/
|
*/
|
||||||
bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) {
|
bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) {
|
||||||
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
|
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
|
||||||
|
if(!client->tcp || !client->tcp->connected()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
client->tcp->readBytes(out, n, std::bind([](WSclient_t * client, bool ok, WSreadWaitCb cb) {
|
client->tcp->readBytes(out, n, std::bind([](WSclient_t * client, bool ok, WSreadWaitCb cb) {
|
||||||
if(cb) {
|
if(cb) {
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ )
|
#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ )
|
||||||
|
|
||||||
#ifndef DEBUG_WEBSOCKETS
|
#ifndef DEBUG_WEBSOCKETS
|
||||||
#define DEBUG_WEBSOCKETS(...)
|
#define DEBUG_WEBSOCKETS(...)
|
||||||
|
@ -89,6 +89,7 @@ void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String f
|
|||||||
* called in arduino loop
|
* called in arduino loop
|
||||||
*/
|
*/
|
||||||
void WebSocketsClient::loop(void) {
|
void WebSocketsClient::loop(void) {
|
||||||
|
#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
|
||||||
if(!clientIsConnected(&_client)) {
|
if(!clientIsConnected(&_client)) {
|
||||||
|
|
||||||
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
|
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
|
||||||
@ -146,10 +147,9 @@ void WebSocketsClient::loop(void) {
|
|||||||
delay(10); //some little delay to not flood the server
|
delay(10); //some little delay to not flood the server
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
|
|
||||||
handleClientData();
|
handleClientData();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -269,11 +269,17 @@ void WebSocketsClient::clientDisconnect(WSclient_t * client) {
|
|||||||
|
|
||||||
if(client->tcp) {
|
if(client->tcp) {
|
||||||
if(client->tcp->connected()) {
|
if(client->tcp->connected()) {
|
||||||
|
#if (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC)
|
||||||
client->tcp->flush();
|
client->tcp->flush();
|
||||||
|
#endif
|
||||||
client->tcp->stop();
|
client->tcp->stop();
|
||||||
}
|
}
|
||||||
event = true;
|
event = true;
|
||||||
|
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
|
||||||
|
client->status = WSC_NOT_CONNECTED;
|
||||||
|
#else
|
||||||
delete client->tcp;
|
delete client->tcp;
|
||||||
|
#endif
|
||||||
client->tcp = NULL;
|
client->tcp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,6 +296,7 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) {
|
|||||||
|
|
||||||
// state is not connected or tcp connection is lost
|
// state is not connected or tcp connection is lost
|
||||||
if(!clientIsConnected(client)) {
|
if(!clientIsConnected(client)) {
|
||||||
|
|
||||||
client->tcp = TCPclient;
|
client->tcp = TCPclient;
|
||||||
|
|
||||||
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
|
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
|
||||||
@ -316,6 +317,18 @@ bool WebSocketsServer::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclient) {
|
|||||||
|
|
||||||
|
|
||||||
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
|
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
|
||||||
|
client->tcp->onDisconnect(std::bind([](WebSocketsServer * server, AsyncTCPbuffer * obj, WSclient_t * client) -> bool {
|
||||||
|
DEBUG_WEBSOCKETS("[WS-Server][%d] Disconnect client\n", client->num);
|
||||||
|
|
||||||
|
AsyncTCPbuffer ** sl = &server->_clients[client->num].tcp;
|
||||||
|
if(*sl == obj) {
|
||||||
|
client->status = WSC_NOT_CONNECTED;
|
||||||
|
*sl = NULL;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}, this, std::placeholders::_1, client));
|
||||||
|
|
||||||
|
|
||||||
client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine)));
|
client->tcp->readStringUntil('\n', &(client->cHttpLine), std::bind(&WebSocketsServer::handleHeader, this, client, &(client->cHttpLine)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -375,7 +388,11 @@ void WebSocketsServer::clientDisconnect(WSclient_t * client) {
|
|||||||
#endif
|
#endif
|
||||||
client->tcp->stop();
|
client->tcp->stop();
|
||||||
}
|
}
|
||||||
|
#if (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
|
||||||
|
client->status = WSC_NOT_CONNECTED;
|
||||||
|
#else
|
||||||
delete client->tcp;
|
delete client->tcp;
|
||||||
|
#endif
|
||||||
client->tcp = NULL;
|
client->tcp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,6 +442,7 @@ bool WebSocketsServer::clientIsConnected(WSclient_t * client) {
|
|||||||
|
|
||||||
if(client->tcp) {
|
if(client->tcp) {
|
||||||
// do cleanup
|
// do cleanup
|
||||||
|
DEBUG_WEBSOCKETS("[WS-Server][%d] client list cleanup.\n", client->num);
|
||||||
clientDisconnect(client);
|
clientDisconnect(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user