@@ -328,6 +328,7 @@ static int8_t _tcp_accept(void * arg, AsyncClient * client) {
328
328
typedef struct {
329
329
struct tcpip_api_call_data call;
330
330
tcp_pcb * pcb;
331
+ AsyncClient * client;
331
332
int8_t err;
332
333
union {
333
334
struct {
@@ -351,34 +352,42 @@ typedef struct {
351
352
352
353
static err_t _tcp_output_api (struct tcpip_api_call_data *api_call_msg){
353
354
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
354
- msg->err = tcp_output (msg->pcb );
355
+ msg->err = 0 ;
356
+ if (msg->client && msg->client ->pcb ()){
357
+ msg->err = tcp_output (msg->pcb );
358
+ }
355
359
return msg->err ;
356
360
}
357
361
358
- static esp_err_t _tcp_output (tcp_pcb * pcb) {
362
+ static esp_err_t _tcp_output (tcp_pcb * pcb, AsyncClient * client ) {
359
363
if (!pcb){
360
364
log_w (" pcb is NULL" );
361
365
return ESP_FAIL;
362
366
}
363
367
tcp_api_call_t msg;
364
368
msg.pcb = pcb;
369
+ msg.client = client;
365
370
tcpip_api_call (_tcp_output_api, (struct tcpip_api_call_data *)&msg);
366
371
return msg.err ;
367
372
}
368
373
369
374
static err_t _tcp_write_api (struct tcpip_api_call_data *api_call_msg){
370
375
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
371
- msg->err = tcp_write (msg->pcb , msg->write .data , msg->write .size , msg->write .apiflags );
376
+ msg->err = 0 ;
377
+ if (msg->client && msg->client ->pcb ()){
378
+ msg->err = tcp_write (msg->pcb , msg->write .data , msg->write .size , msg->write .apiflags );
379
+ }
372
380
return msg->err ;
373
381
}
374
382
375
- static esp_err_t _tcp_write (tcp_pcb * pcb, const char * data, size_t size, uint8_t apiflags) {
383
+ static esp_err_t _tcp_write (tcp_pcb * pcb, const char * data, size_t size, uint8_t apiflags, AsyncClient * client ) {
376
384
if (!pcb){
377
385
log_w (" pcb is NULL" );
378
386
return ESP_FAIL;
379
387
}
380
388
tcp_api_call_t msg;
381
389
msg.pcb = pcb;
390
+ msg.client = client;
382
391
msg.write .data = data;
383
392
msg.write .size = size;
384
393
msg.write .apiflags = apiflags;
@@ -389,74 +398,84 @@ static esp_err_t _tcp_write(tcp_pcb * pcb, const char* data, size_t size, uint8_
389
398
static err_t _tcp_recved_api (struct tcpip_api_call_data *api_call_msg){
390
399
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
391
400
msg->err = 0 ;
392
- tcp_recved (msg->pcb , msg->received );
401
+ if (msg->client && msg->client ->pcb ()){
402
+ tcp_recved (msg->pcb , msg->received );
403
+ }
393
404
return msg->err ;
394
405
}
395
406
396
- static esp_err_t _tcp_recved (tcp_pcb * pcb, size_t len) {
407
+ static esp_err_t _tcp_recved (tcp_pcb * pcb, size_t len, AsyncClient * client ) {
397
408
if (!pcb){
398
409
log_w (" pcb is NULL" );
399
410
return ESP_FAIL;
400
411
}
401
412
tcp_api_call_t msg;
402
413
msg.pcb = pcb;
414
+ msg.client = client;
403
415
msg.received = len;
404
416
tcpip_api_call (_tcp_recved_api, (struct tcpip_api_call_data *)&msg);
405
417
return msg.err ;
406
418
}
407
419
408
- static err_t _tcp_connect_api (struct tcpip_api_call_data *api_call_msg){
420
+ static err_t _tcp_close_api (struct tcpip_api_call_data *api_call_msg){
409
421
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
410
- msg->err = tcp_connect (msg->pcb , msg->connect .addr , msg->connect .port , msg->connect .cb );
422
+ msg->err = 0 ;
423
+ if (msg->client && msg->client ->pcb ()){
424
+ msg->err = tcp_close (msg->pcb );
425
+ }
411
426
return msg->err ;
412
427
}
413
428
414
- static esp_err_t _tcp_connect (tcp_pcb * pcb, ip_addr_t * addr, uint16_t port, tcp_connected_fn cb ) {
429
+ static esp_err_t _tcp_close (tcp_pcb * pcb, AsyncClient * client ) {
415
430
if (!pcb){
416
431
log_w (" pcb is NULL" );
417
432
return ESP_FAIL;
418
433
}
419
434
tcp_api_call_t msg;
420
435
msg.pcb = pcb;
421
- msg.connect .addr = addr;
422
- msg.connect .port = port;
423
- msg.connect .cb = cb;
424
- tcpip_api_call (_tcp_connect_api, (struct tcpip_api_call_data *)&msg);
436
+ msg.client = client;
437
+ tcpip_api_call (_tcp_close_api, (struct tcpip_api_call_data *)&msg);
425
438
return msg.err ;
426
439
}
427
440
428
- static err_t _tcp_close_api (struct tcpip_api_call_data *api_call_msg){
441
+ static err_t _tcp_abort_api (struct tcpip_api_call_data *api_call_msg){
429
442
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
430
- msg->err = tcp_close (msg->pcb );
443
+ msg->err = 0 ;
444
+ if (msg->client && msg->client ->pcb ()){
445
+ tcp_abort (msg->pcb );
446
+ }
431
447
return msg->err ;
432
448
}
433
449
434
- static esp_err_t _tcp_close (tcp_pcb * pcb) {
450
+ static esp_err_t _tcp_abort (tcp_pcb * pcb, AsyncClient * client ) {
435
451
if (!pcb){
436
452
log_w (" pcb is NULL" );
437
453
return ESP_FAIL;
438
454
}
439
455
tcp_api_call_t msg;
440
456
msg.pcb = pcb;
441
- tcpip_api_call (_tcp_close_api, (struct tcpip_api_call_data *)&msg);
457
+ msg.client = client;
458
+ tcpip_api_call (_tcp_abort_api, (struct tcpip_api_call_data *)&msg);
442
459
return msg.err ;
443
460
}
444
461
445
- static err_t _tcp_abort_api (struct tcpip_api_call_data *api_call_msg){
462
+ static err_t _tcp_connect_api (struct tcpip_api_call_data *api_call_msg){
446
463
tcp_api_call_t * msg = (tcp_api_call_t *)api_call_msg;
447
- msg->err = 0 ;
448
- tcp_abort (msg->pcb );
464
+ msg->err = tcp_connect (msg->pcb , msg->connect .addr , msg->connect .port , msg->connect .cb );
449
465
return msg->err ;
450
466
}
451
467
452
- static esp_err_t _tcp_abort (tcp_pcb * pcb) {
468
+ static esp_err_t _tcp_connect (tcp_pcb * pcb, ip_addr_t * addr, uint16_t port, tcp_connected_fn cb ) {
453
469
if (!pcb){
454
470
log_w (" pcb is NULL" );
455
471
return ESP_FAIL;
456
472
}
457
473
tcp_api_call_t msg;
458
474
msg.pcb = pcb;
459
- tcpip_api_call (_tcp_abort_api, (struct tcpip_api_call_data *)&msg);
475
+ msg.connect .addr = addr;
476
+ msg.connect .port = port;
477
+ msg.connect .cb = cb;
478
+ tcpip_api_call (_tcp_connect_api, (struct tcpip_api_call_data *)&msg);
460
479
return msg.err ;
461
480
}
462
481
@@ -606,7 +625,7 @@ int8_t AsyncClient::_close(){
606
625
tcp_err (_pcb, NULL );
607
626
tcp_poll (_pcb, NULL , 0 );
608
627
_tcp_clear_events (this );
609
- err = _tcp_close (_pcb);
628
+ err = _tcp_close (_pcb, this );
610
629
if (err != ERR_OK) {
611
630
err = abort ();
612
631
}
@@ -704,7 +723,7 @@ int8_t AsyncClient::_recv(tcp_pcb* pcb, pbuf* pb, int8_t err) {
704
723
if (!_ack_pcb) {
705
724
_rx_ack_len += b->len ;
706
725
} else if (_pcb) {
707
- _tcp_recved (_pcb, b->len );
726
+ _tcp_recved (_pcb, b->len , this );
708
727
}
709
728
pbuf_free (b);
710
729
}
@@ -773,15 +792,15 @@ bool AsyncClient::connect(const char* host, uint16_t port){
773
792
774
793
int8_t AsyncClient::abort (){
775
794
if (_pcb) {
776
- _tcp_abort (_pcb);
795
+ _tcp_abort (_pcb, this );
777
796
_pcb = NULL ;
778
797
}
779
798
return ERR_ABRT;
780
799
}
781
800
782
801
void AsyncClient::close (bool now){
783
802
if (_pcb){
784
- _tcp_recved (_pcb, _rx_ack_len);
803
+ _tcp_recved (_pcb, _rx_ack_len, this );
785
804
}
786
805
_close ();
787
806
}
@@ -833,7 +852,7 @@ size_t AsyncClient::add(const char* data, size_t size, uint8_t apiflags) {
833
852
}
834
853
size_t will_send = (room < size) ? room : size;
835
854
int8_t err = ERR_OK;
836
- err = _tcp_write (_pcb, data, will_send, apiflags);
855
+ err = _tcp_write (_pcb, data, will_send, apiflags, this );
837
856
if (err != ERR_OK) {
838
857
return 0 ;
839
858
}
@@ -842,7 +861,7 @@ size_t AsyncClient::add(const char* data, size_t size, uint8_t apiflags) {
842
861
843
862
bool AsyncClient::send (){
844
863
int8_t err = ERR_OK;
845
- err = _tcp_output (_pcb);
864
+ err = _tcp_output (_pcb, this );
846
865
if (err == ERR_OK){
847
866
_pcb_busy = true ;
848
867
_pcb_sent_at = millis ();
@@ -855,7 +874,7 @@ size_t AsyncClient::ack(size_t len){
855
874
if (len > _rx_ack_len)
856
875
len = _rx_ack_len;
857
876
if (len){
858
- _tcp_recved (_pcb, len);
877
+ _tcp_recved (_pcb, len, this );
859
878
}
860
879
_rx_ack_len -= len;
861
880
return len;
@@ -996,7 +1015,7 @@ void AsyncClient::ackPacket(struct pbuf * pb){
996
1015
if (!pb){
997
1016
return ;
998
1017
}
999
- _tcp_recved (_pcb, pb->len );
1018
+ _tcp_recved (_pcb, pb->len , this );
1000
1019
pbuf_free (pb);
1001
1020
}
1002
1021
@@ -1232,7 +1251,7 @@ void AsyncServer::begin(){
1232
1251
err = _tcp_bind (_pcb, &local_addr, _port);
1233
1252
1234
1253
if (err != ERR_OK) {
1235
- _tcp_close (_pcb);
1254
+ _tcp_close (_pcb, NULL );
1236
1255
log_e (" bind error: %d" , err);
1237
1256
return ;
1238
1257
}
@@ -1251,7 +1270,7 @@ void AsyncServer::end(){
1251
1270
if (_pcb){
1252
1271
tcp_arg (_pcb, NULL );
1253
1272
tcp_accept (_pcb, NULL );
1254
- _tcp_abort (_pcb);
1273
+ _tcp_abort (_pcb, NULL );
1255
1274
_pcb = NULL ;
1256
1275
}
1257
1276
}
0 commit comments