@@ -448,8 +448,23 @@ static int8_t _tcp_sent(void *arg, struct tcp_pcb *pcb, uint16_t len) {
448
448
return ERR_OK;
449
449
}
450
450
451
- static void _tcp_error (void *arg, int8_t err) {
451
+ void AsyncClient:: _tcp_error (void *arg, int8_t err) {
452
452
// ets_printf("+E: 0x%08x\n", arg);
453
+ AsyncClient *client = reinterpret_cast <AsyncClient *>(arg);
454
+ if (client && client->_pcb ) {
455
+ if (client->_pcb ->state == LISTEN) {
456
+ client->_pcb ->sent = NULL ;
457
+ client->_pcb ->recv = NULL ;
458
+ client->_pcb ->errf = NULL ;
459
+ client->_pcb ->poll = NULL ;
460
+ client->_pcb ->pollinterval = 0 ;
461
+ }
462
+ client->_pcb ->callback_arg = NULL ;
463
+ client->_pcb = nullptr ;
464
+ client->_free_closed_slot ();
465
+ }
466
+
467
+ // enqueue event to be processed in the async task for the user callback
453
468
lwip_tcp_event_packet_t *e = (lwip_tcp_event_packet_t *)malloc (sizeof (lwip_tcp_event_packet_t ));
454
469
if (!e) {
455
470
log_e (" Failed to allocate event packet" );
@@ -459,7 +474,7 @@ static void _tcp_error(void *arg, int8_t err) {
459
474
e->arg = arg;
460
475
e->error .err = err;
461
476
if (!_send_async_event (&e)) {
462
- free ((void *)(e));
477
+ :: free ((void *)(e));
463
478
}
464
479
}
465
480
@@ -1046,19 +1061,6 @@ int8_t AsyncClient::_connected(tcp_pcb *pcb, int8_t err) {
1046
1061
}
1047
1062
1048
1063
void AsyncClient::_error (int8_t err) {
1049
- if (_pcb) {
1050
- TCP_MUTEX_LOCK ();
1051
- tcp_arg (_pcb, NULL );
1052
- if (_pcb->state == LISTEN) {
1053
- tcp_sent (_pcb, NULL );
1054
- tcp_recv (_pcb, NULL );
1055
- tcp_err (_pcb, NULL );
1056
- tcp_poll (_pcb, NULL , 0 );
1057
- }
1058
- TCP_MUTEX_UNLOCK ();
1059
- _free_closed_slot ();
1060
- _pcb = NULL ;
1061
- }
1062
1064
if (_error_cb) {
1063
1065
_error_cb (_error_cb_arg, this , err);
1064
1066
}
0 commit comments