From e32c8625c0b5b0b156006ce55184f6f72421cceb Mon Sep 17 00:00:00 2001 From: Juraj Andrassy Date: Thu, 17 Sep 2020 19:14:14 +0200 Subject: [PATCH] WiFiSever - Arduino API available() and accept() --- libraries/ESP8266WiFi/src/WiFiServer.cpp | 20 +++++++++++++++++++- libraries/ESP8266WiFi/src/WiFiServer.h | 10 +++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiServer.cpp b/libraries/ESP8266WiFi/src/WiFiServer.cpp index 2ee09f85fe..678803070a 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.cpp +++ b/libraries/ESP8266WiFi/src/WiFiServer.cpp @@ -115,7 +115,7 @@ bool WiFiServer::hasClient() { return false; } -WiFiClient WiFiServer::available(byte* status) { +WiFiClient WiFiServer::accept(byte* status) { (void) status; if (_unclaimed) { WiFiClient result(_unclaimed); @@ -135,6 +135,24 @@ WiFiClient WiFiServer::available(byte* status) { return WiFiClient(); } +WiFiClient WiFiServer::available() { + for (uint8_t i = 0; i < MAX_MONITORED_CLIENTS; i++) { + WiFiClient& client = connectedClients[i]; + if (client && client.status() == CLOSED) { + client = WiFiClient(); + } + if (!client) { + client = accept(); + } + } + for (uint8_t i = 0; i < MAX_MONITORED_CLIENTS; i++) { + WiFiClient& client = connectedClients[i]; + if (client.available()) + return client; + } + return WiFiClient(); +} + uint8_t WiFiServer::status() { if (!_listen_pcb) return CLOSED; diff --git a/libraries/ESP8266WiFi/src/WiFiServer.h b/libraries/ESP8266WiFi/src/WiFiServer.h index 9df758bf05..9635837581 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.h +++ b/libraries/ESP8266WiFi/src/WiFiServer.h @@ -65,6 +65,10 @@ extern "C" { class ClientContext; class WiFiClient; +#ifndef MAX_MONITORED_CLIENTS +#define MAX_MONITORED_CLIENTS 5 +#endif + class WiFiServer : public Server { // Secure server needs access to all the private entries here protected: @@ -74,13 +78,17 @@ class WiFiServer : public Server { ClientContext* _unclaimed; ClientContext* _discarded; + + WiFiClient connectedClients[MAX_MONITORED_CLIENTS]; + enum { _ndDefault, _ndFalse, _ndTrue } _noDelay = _ndDefault; public: WiFiServer(const IPAddress& addr, uint16_t port); WiFiServer(uint16_t port); virtual ~WiFiServer() {} - WiFiClient available(uint8_t* status = NULL); + WiFiClient accept(uint8_t* status = NULL); + WiFiClient available(); bool hasClient(); void begin(); void begin(uint16_t port);