From 1f0af30d97634665458ae4e68fd41e3686d75709 Mon Sep 17 00:00:00 2001 From: bbx10node Date: Fri, 19 May 2017 09:16:51 -1000 Subject: [PATCH 1/2] Add setNoDelay and getNoDelay to WiFiServer class --- libraries/WiFi/src/WiFiServer.cpp | 15 +++++++++++++-- libraries/WiFi/src/WiFiServer.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiServer.cpp b/libraries/WiFi/src/WiFiServer.cpp index a10e3b1621b..1174697aa75 100644 --- a/libraries/WiFi/src/WiFiServer.cpp +++ b/libraries/WiFi/src/WiFiServer.cpp @@ -45,8 +45,11 @@ WiFiClient WiFiServer::available(){ int client_sock = accept(sockfd, (struct sockaddr *)&_client, (socklen_t*)&cs); if(client_sock >= 0){ int val = 1; - if(setsockopt(client_sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&val, sizeof(int)) == ESP_OK) - return WiFiClient(client_sock); + if(setsockopt(client_sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&val, sizeof(int)) == ESP_OK) { + val = _noDelay; + if(setsockopt(client_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&val, sizeof(int)) == ESP_OK) + return WiFiClient(client_sock); + } } return WiFiClient(); } @@ -69,6 +72,14 @@ void WiFiServer::begin(){ _listening = true; } +void WiFiServer::setNoDelay(bool nodelay) { + _noDelay = nodelay; +} + +bool WiFiServer::getNoDelay() { + return _noDelay; +} + void WiFiServer::end(){ close(sockfd); sockfd = -1; diff --git a/libraries/WiFi/src/WiFiServer.h b/libraries/WiFi/src/WiFiServer.h index b2d9996f9d9..38433a06714 100644 --- a/libraries/WiFi/src/WiFiServer.h +++ b/libraries/WiFi/src/WiFiServer.h @@ -29,6 +29,7 @@ class WiFiServer : public Server { uint16_t _port; uint8_t _max_clients; bool _listening; + bool _noDelay = false; public: void listenOnLocalhost(){} @@ -38,6 +39,8 @@ class WiFiServer : public Server { WiFiClient available(); WiFiClient accept(){return available();} void begin(); + void setNoDelay(bool nodelay); + bool getNoDelay(); size_t write(const uint8_t *data, size_t len); size_t write(uint8_t data){ return write(&data, 1); From a02533bca01d793b4b789999f7ad5d1885c3c0ef Mon Sep 17 00:00:00 2001 From: bbx10node Date: Fri, 19 May 2017 09:34:55 -1000 Subject: [PATCH 2/2] Remote TCP disconnect not detected --- libraries/WiFi/src/WiFiClient.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiClient.cpp b/libraries/WiFi/src/WiFiClient.cpp index 10906952bf9..b1b6e72ce9e 100644 --- a/libraries/WiFi/src/WiFiClient.cpp +++ b/libraries/WiFi/src/WiFiClient.cpp @@ -279,8 +279,28 @@ void WiFiClient::flush() { uint8_t WiFiClient::connected() { - uint8_t dummy = 0; - read(&dummy, 0); + if (_connected) { + uint8_t dummy; + int res = recv(fd(), &dummy, 0, MSG_DONTWAIT); + if (res <= 0) { + switch (errno) { + case ENOTCONN: + case EPIPE: + case ECONNRESET: + case ECONNREFUSED: + case ECONNABORTED: + _connected = false; + break; + default: + _connected = true; + break; + } + } + else { + // Should never happen since requested 0 bytes + _connected = true; + } + } return _connected; }