diff --git a/src/WiFiClient.cpp b/src/WiFiClient.cpp index bfc21ec7..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) { @@ -207,24 +207,50 @@ 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; + if (!written && _retrySend) { + written = retry(buf, size, true); + } + if(!written){ + // close socket + ServerDrv::stopClient(_sock); + setWriteError(); + return 0; } + if (!ServerDrv::checkDataSent(_sock)) { - setWriteError(); - return 0; + 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) { @@ -256,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