Skip to content

Commit aef739f

Browse files
authored
Merge pull request #146 from giulcioffi/Issue61_lwip_disconn
Add possibility to resend data if lwip_send fails
2 parents 08f534e + c0f37d0 commit aef739f

File tree

2 files changed

+42
-9
lines changed

2 files changed

+42
-9
lines changed

src/WiFiClient.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ extern "C" {
3535

3636
uint16_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

4444
int 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+
228254
int 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+
259289
void WiFiClient::flush() {
260290
// TODO: a real check to ensure transmission has been completed
261291
}

src/WiFiClient.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@ class WiFiClient : public Client {
4040
virtual int connectBearSSL(const char *host, uint16_t port);
4141
virtual size_t write(uint8_t);
4242
virtual size_t write(const uint8_t *buf, size_t size);
43+
virtual size_t retry(const uint8_t *buf, size_t size, bool write);
4344
virtual int available();
4445
virtual int read();
4546
virtual int read(uint8_t *buf, size_t size);
4647
virtual int peek();
48+
virtual void setRetry(bool retry);
4749
virtual void flush();
4850
virtual void stop();
4951
virtual uint8_t connected();
@@ -61,6 +63,7 @@ class WiFiClient : public Client {
6163
static uint16_t _srcport;
6264
uint8_t _sock; //not used
6365
uint16_t _socket;
66+
bool _retrySend;
6467
};
6568

6669
#endif

0 commit comments

Comments
 (0)