@@ -701,7 +701,12 @@ static mp_uint_t lwip_tcp_send(lwip_socket_obj_t *socket, const byte *buf, mp_ui
701
701
702
702
MICROPY_PY_LWIP_ENTER
703
703
704
- u16_t available = tcp_sndbuf (socket -> pcb .tcp );
704
+ // If the socket is still connecting then don't let data be written to it.
705
+ // Otherwise, get the number of available bytes in the output buffer.
706
+ u16_t available = 0 ;
707
+ if (socket -> state != STATE_CONNECTING ) {
708
+ available = tcp_sndbuf (socket -> pcb .tcp );
709
+ }
705
710
706
711
if (available == 0 ) {
707
712
// Non-blocking socket
@@ -718,7 +723,8 @@ static mp_uint_t lwip_tcp_send(lwip_socket_obj_t *socket, const byte *buf, mp_ui
718
723
// If peer fully closed socket, we would have socket->state set to ERR_RST (connection
719
724
// reset) by error callback.
720
725
// Avoid sending too small packets, so wait until at least 16 bytes available
721
- while (socket -> state >= STATE_CONNECTED && (available = tcp_sndbuf (socket -> pcb .tcp )) < 16 ) {
726
+ while (socket -> state == STATE_CONNECTING
727
+ || (socket -> state >= STATE_CONNECTED && (available = tcp_sndbuf (socket -> pcb .tcp )) < 16 )) {
722
728
MICROPY_PY_LWIP_EXIT
723
729
if (socket -> timeout != -1 && mp_hal_ticks_ms () - start > socket -> timeout ) {
724
730
* _errno = MP_ETIMEDOUT ;
@@ -1548,7 +1554,7 @@ static mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
1548
1554
// raw socket is writable
1549
1555
ret |= MP_STREAM_POLL_WR ;
1550
1556
#endif
1551
- } else if (socket -> pcb .tcp != NULL && tcp_sndbuf (socket -> pcb .tcp ) > 0 ) {
1557
+ } else if (socket -> state != STATE_CONNECTING && socket -> pcb .tcp != NULL && tcp_sndbuf (socket -> pcb .tcp ) > 0 ) {
1552
1558
// TCP socket is writable
1553
1559
// Note: pcb.tcp==NULL if state<0, and in this case we can't call tcp_sndbuf
1554
1560
ret |= MP_STREAM_POLL_WR ;
0 commit comments