kopia lustrzana https://github.com/micropython/micropython
extmod/modlwip: Still process remaining incoming data of a closed socket.
It can happen that a socket gets closed while the pbuf is not completely drained by the application. It can also happen that a new pbuf comes in via the recv callback, and then a "peer closed" event comes via the same callback (pbuf=NULL) before the previous event has been handled. In both cases the socket is closed but there is remaining data. This patch makes sure such data is passed to the application.pull/1888/head
rodzic
6d2e9e70b3
commit
4f64f6bfd3
|
@ -384,11 +384,6 @@ STATIC mp_uint_t lwip_tcp_send(lwip_socket_obj_t *socket, const byte *buf, mp_ui
|
||||||
|
|
||||||
// Helper function for recv/recvfrom to handle TCP packets
|
// Helper function for recv/recvfrom to handle TCP packets
|
||||||
STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) {
|
STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) {
|
||||||
|
|
||||||
if (socket->state == STATE_PEER_CLOSED) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (socket->incoming.pbuf == NULL) {
|
if (socket->incoming.pbuf == NULL) {
|
||||||
mp_uint_t start = mp_hal_ticks_ms();
|
mp_uint_t start = mp_hal_ticks_ms();
|
||||||
while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == NULL) {
|
while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == NULL) {
|
||||||
|
@ -399,7 +394,10 @@ STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_
|
||||||
poll_sockets();
|
poll_sockets();
|
||||||
}
|
}
|
||||||
if (socket->state == STATE_PEER_CLOSED) {
|
if (socket->state == STATE_PEER_CLOSED) {
|
||||||
return 0;
|
if (socket->incoming.pbuf == NULL) {
|
||||||
|
// socket closed and no data left in buffer
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else if (socket->state != STATE_CONNECTED) {
|
} else if (socket->state != STATE_CONNECTED) {
|
||||||
*_errno = -socket->state;
|
*_errno = -socket->state;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Ładowanie…
Reference in New Issue