From f4c37bb2b6fa7c627acd80282304db4626f59941 Mon Sep 17 00:00:00 2001 From: giulcioffi Date: Tue, 5 Jan 2021 10:25:32 +0100 Subject: [PATCH 1/2] Retry send up to 5 times, then close socket --- src/WiFiClient.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/WiFiClient.cpp b/src/WiFiClient.cpp index bfc21ec7..2d75cdc0 100644 --- a/src/WiFiClient.cpp +++ b/src/WiFiClient.cpp @@ -207,19 +207,29 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) { if (size==0) { setWriteError(); - return 0; + return 0; } - size_t written = ServerDrv::sendData(_sock, buf, size); - if (!written) - { - setWriteError(); - return 0; + bool success = false; + size_t written = 0; + for (int i=0; i<5; i++) { + written = ServerDrv::sendData(_sock, buf, size); + if (written) { + success = true; + break; + } } - if (!ServerDrv::checkDataSent(_sock)) - { - setWriteError(); - return 0; + if (success) { + if (!ServerDrv::checkDataSent(_sock)) + { + setWriteError(); + return 0; + } + } else { + // close socket + ServerDrv::stopClient(_sock); + setWriteError(); + return 0; } return written; From c0f37d0937ed94c5c12ec45ba7a103521067e8fe Mon Sep 17 00:00:00 2001 From: giulcioffi Date: Tue, 5 Jan 2021 13:00:50 +0100 Subject: [PATCH 2/2] Add retry function and call it by default + add setRetry(bool) to let user disable retry --- src/WiFiClient.cpp | 54 +++++++++++++++++++++++++++++++--------------- src/WiFiClient.h | 3 +++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/WiFiClient.cpp b/src/WiFiClient.cpp index 2d75cdc0..b8ec61dd 100644 --- a/src/WiFiClient.cpp +++ b/src/WiFiClient.cpp @@ -35,10 +35,10 @@ extern "C" { uint16_t WiFiClient::_srcport = 1024; -WiFiClient::WiFiClient() : _sock(NO_SOCKET_AVAIL) { +WiFiClient::WiFiClient() : _sock(NO_SOCKET_AVAIL), _retrySend(true) { } -WiFiClient::WiFiClient(uint8_t sock) : _sock(sock) { +WiFiClient::WiFiClient(uint8_t sock) : _sock(sock), _retrySend(true) { } int WiFiClient::connect(const char* host, uint16_t port) { @@ -210,31 +210,47 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) { return 0; } - bool success = false; - size_t written = 0; - for (int i=0; i<5; i++) { - written = ServerDrv::sendData(_sock, buf, size); - if (written) { - success = true; - break; - } + size_t written = ServerDrv::sendData(_sock, buf, size); + if (!written && _retrySend) { + written = retry(buf, size, true); } - if (success) { - if (!ServerDrv::checkDataSent(_sock)) - { - setWriteError(); - return 0; - } - } else { + if(!written){ // close socket ServerDrv::stopClient(_sock); setWriteError(); return 0; } + if (!ServerDrv::checkDataSent(_sock)) + { + setWriteError(); + return 0; + } + return written; } +size_t WiFiClient::retry(const uint8_t *buf, size_t size, bool write) { + size_t rec_bytes = 0; + + if (write) { + + //RETRY WRITE + for (int i=0; i<5; i++) { + rec_bytes = ServerDrv::sendData(_sock, buf, size); + if (rec_bytes) { + break; + } + } + return rec_bytes; + + } else { + //RETRY READ + // To be implemented, if needed + } + +} + int WiFiClient::available() { if (_sock != 255) { @@ -266,6 +282,10 @@ int WiFiClient::peek() { return WiFiSocketBuffer.peek(_sock); } +void WiFiClient::setRetry(bool retry) { + _retrySend = retry; +} + void WiFiClient::flush() { // TODO: a real check to ensure transmission has been completed } diff --git a/src/WiFiClient.h b/src/WiFiClient.h index 8fcb47a4..a6f43e2b 100644 --- a/src/WiFiClient.h +++ b/src/WiFiClient.h @@ -40,10 +40,12 @@ class WiFiClient : public Client { virtual int connectBearSSL(const char *host, uint16_t port); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *buf, size_t size); + virtual size_t retry(const uint8_t *buf, size_t size, bool write); virtual int available(); virtual int read(); virtual int read(uint8_t *buf, size_t size); virtual int peek(); + virtual void setRetry(bool retry); virtual void flush(); virtual void stop(); virtual uint8_t connected(); @@ -61,6 +63,7 @@ class WiFiClient : public Client { static uint16_t _srcport; uint8_t _sock; //not used uint16_t _socket; + bool _retrySend; }; #endif