@@ -53,7 +53,7 @@ UIPClient::connect(IPAddress ip, uint16_t port)
53
53
if (conn)
54
54
{
55
55
#if UIP_CONNECT_TIMEOUT > 0
56
- int32_t timeout = millis () + 1000 * UIP_CONNECT_TIMEOUT;
56
+ uint32_t timeout = millis () + 1000 * UIP_CONNECT_TIMEOUT;
57
57
#endif
58
58
while ((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED)
59
59
{
@@ -108,7 +108,6 @@ UIPClient::stop()
108
108
Serial.println (F (" before stop(), with data" ));
109
109
_dumpAllData ();
110
110
#endif
111
- _flushBlocks (data->packets_in );
112
111
if (data->state & UIP_CLIENT_REMOTECLOSED)
113
112
{
114
113
data->state = 0 ;
@@ -118,6 +117,7 @@ UIPClient::stop()
118
117
flush ();
119
118
data->state |= UIP_CLIENT_CLOSE;
120
119
}
120
+ _flushBlocks (data->packets_in );
121
121
#ifdef UIPETHERNET_DEBUG_CLIENT
122
122
Serial.println (F (" after stop()" ));
123
123
_dumpAllData ();
@@ -170,7 +170,7 @@ UIPClient::write(const uint8_t *buf, size_t size)
170
170
UIPEthernetClass::tick ();
171
171
if (u && u->state && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
172
172
{
173
- uint8_t p = _currentBlock (u->packets_out );
173
+ uint8_t p = _currentBlock (u->packets_out , u-> out_pos );
174
174
if (u->packets_out [p] == NOBLOCK)
175
175
{
176
176
newpacket:
@@ -208,7 +208,10 @@ UIPClient::write(const uint8_t *buf, size_t size)
208
208
if (remain > 0 )
209
209
{
210
210
if (p == 0 ) // block 0 just filled, start sending immediately
211
+ {
211
212
flush ();
213
+ goto repeat;
214
+ }
212
215
if (p == UIP_SOCKET_NUMPACKETS-1 )
213
216
{
214
217
#if UIP_WRITE_TIMEOUT > 0
@@ -237,7 +240,7 @@ UIPClient::availableForWrite()
237
240
UIPEthernetClass::tick ();
238
241
if (data->packets_out [0 ] == NOBLOCK)
239
242
return MAX_AVAILABLE;
240
- uint8_t p = _currentBlock (data->packets_out );
243
+ uint8_t p = _currentBlock (data->packets_out , data-> out_pos );
241
244
int used = UIP_SOCKET_DATALEN * p + data->out_pos ;
242
245
return MAX_AVAILABLE - used;
243
246
}
@@ -401,7 +404,7 @@ uipclient_appcall(void)
401
404
Serial.print (F (" UIPClient uip_newdata, uip_len:" ));
402
405
Serial.println (uip_len);
403
406
#endif
404
- if (uip_len && !( u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED) ))
407
+ if (uip_len && u->state && !(u-> state & UIP_CLIENT_CLOSE ))
405
408
{
406
409
for (uint8_t i=0 ; i < UIP_SOCKET_NUMPACKETS; i++)
407
410
{
@@ -539,12 +542,18 @@ UIPClient::_allocateData()
539
542
}
540
543
541
544
uint8_t
542
- UIPClient::_currentBlock (memhandle* block)
545
+ UIPClient::_currentBlock (memhandle* block, uint16_t out_pos )
543
546
{
547
+ if (block[0 ] == NOBLOCK)
548
+ return 0 ;
544
549
for (uint8_t i = 1 ; i < UIP_SOCKET_NUMPACKETS; i++)
545
550
{
546
551
if (block[i] == NOBLOCK)
552
+ {
553
+ if (out_pos == Enc28J60Network::blockSize (block[i-1 ])) // block is full
554
+ return i;
547
555
return i-1 ;
556
+ }
548
557
}
549
558
return UIP_SOCKET_NUMPACKETS-1 ;
550
559
}
0 commit comments