@@ -35,10 +35,10 @@ extern "C" {
3535
3636uint16_t WiFiClient::_srcport = 1024 ;
3737
38- WiFiClient::WiFiClient () : _sock(NO_SOCKET_AVAIL) {
38+ WiFiClient::WiFiClient () : _sock(NO_SOCKET_AVAIL), _retrySend( true ) {
3939}
4040
41- WiFiClient::WiFiClient (uint8_t sock) : _sock(sock) {
41+ WiFiClient::WiFiClient (uint8_t sock) : _sock(sock), _retrySend( true ) {
4242}
4343
4444int WiFiClient::connect (const char * host, uint16_t port) {
@@ -207,24 +207,50 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) {
207207 if (size==0 )
208208 {
209209 setWriteError ();
210- return 0 ;
210+ return 0 ;
211211 }
212212
213213 size_t written = ServerDrv::sendData (_sock, buf, size);
214- if (!written)
215- {
216- setWriteError ();
217- return 0 ;
214+ if (!written && _retrySend) {
215+ written = retry (buf, size, true );
216+ }
217+ if (!written){
218+ // close socket
219+ ServerDrv::stopClient (_sock);
220+ setWriteError ();
221+ return 0 ;
218222 }
223+
219224 if (!ServerDrv::checkDataSent (_sock))
220225 {
221- setWriteError ();
222- return 0 ;
226+ setWriteError ();
227+ return 0 ;
223228 }
224229
225230 return written;
226231}
227232
233+ size_t WiFiClient::retry (const uint8_t *buf, size_t size, bool write) {
234+ size_t rec_bytes = 0 ;
235+
236+ if (write) {
237+
238+ // RETRY WRITE
239+ for (int i=0 ; i<5 ; i++) {
240+ rec_bytes = ServerDrv::sendData (_sock, buf, size);
241+ if (rec_bytes) {
242+ break ;
243+ }
244+ }
245+ return rec_bytes;
246+
247+ } else {
248+ // RETRY READ
249+ // To be implemented, if needed
250+ }
251+
252+ }
253+
228254int WiFiClient::available () {
229255 if (_sock != 255 )
230256 {
@@ -256,6 +282,10 @@ int WiFiClient::peek() {
256282 return WiFiSocketBuffer.peek (_sock);
257283}
258284
285+ void WiFiClient::setRetry (bool retry) {
286+ _retrySend = retry;
287+ }
288+
259289void WiFiClient::flush () {
260290 // TODO: a real check to ensure transmission has been completed
261291}
0 commit comments