| 553 | } |
| 554 | |
| 555 | int at_closesocket(int socket) |
| 556 | { |
| 557 | struct at_socket *sock = RT_NULL; |
| 558 | enum at_socket_state last_state; |
| 559 | |
| 560 | /* deal with TCP server actively disconnect */ |
| 561 | rt_thread_delay(rt_tick_from_millisecond(100)); |
| 562 | |
| 563 | sock = at_get_socket(socket); |
| 564 | if (sock == RT_NULL) |
| 565 | { |
| 566 | rt_set_errno(ENXIO); |
| 567 | return -1; |
| 568 | } |
| 569 | |
| 570 | last_state = sock->state; |
| 571 | |
| 572 | /* the rt_at_socket_close is need some time, so change state in advance */ |
| 573 | sock->state = AT_SOCKET_CLOSED; |
| 574 | |
| 575 | if (last_state != AT_SOCKET_CLOSED) |
| 576 | { |
| 577 | if (sock->ops->at_closesocket(sock) != 0) |
| 578 | { |
| 579 | free_socket(sock); |
| 580 | rt_set_errno(EIO); |
| 581 | return -1; |
| 582 | } |
| 583 | } |
| 584 | |
| 585 | free_socket(sock); |
| 586 | return 0; |
| 587 | } |
| 588 | |
| 589 | int at_shutdown(int socket, int how) |
| 590 | { |
no test coverage detected