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);