diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index 95758681162467429f15c4dce5e677c50505329c..43913498f8d54c8fe38307a895943477f3008093 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -513,6 +513,7 @@ static void at_closed_notice_cb(int socket, at_socket_evt_t event, const char *b sock->state = AT_SOCKET_CLOSED; rt_sem_release(sock->recv_notice); } + int at_connect(int socket, const struct sockaddr *name, socklen_t namelen) { struct at_socket *sock; @@ -611,7 +612,13 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f sock->state = AT_SOCKET_CONNECT; } - if (sock->state != AT_SOCKET_CONNECT) + /* socket passively closed, receive function return 0 */ + if (sock->state == AT_SOCKET_CLOSED) + { + result = 0; + goto __exit; + } + else if (sock->state != AT_SOCKET_CONNECT) { LOG_E("received data error, current socket (%d) state (%d) is error.", socket, sock->state); result = -1; @@ -664,7 +671,7 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f else { LOG_D("received data exit, current socket (%d) is closed by remote.", socket); - result = -1; + result = 0; goto __exit; } } @@ -672,18 +679,20 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f __exit: - if (result < 0) - { - at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); - } - else + if (recv_len > 0) { result = recv_len; - if (recv_len) + at_do_event_changes(sock, AT_EVENT_RECV, RT_FALSE); + + if (!rt_slist_isempty(&sock->recvpkt_list)) { - at_do_event_changes(sock, AT_EVENT_RECV, RT_FALSE); + at_do_event_changes(sock, AT_EVENT_RECV, RT_TRUE); } } + else + { + at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); + } return result; } diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h index 2601562019b6fc2ea3938cf864c160da75238ac2..300be42cb2a441f2cc7858658a417daa8a446291 100644 --- a/components/net/at/include/at.h +++ b/components/net/at/include/at.h @@ -32,8 +32,8 @@ extern "C" { #endif -#define AT_SW_VERSION "1.0.1" -#define AT_SW_VERSION_NUM 0x10000 +#define AT_SW_VERSION "1.0.2" +#define AT_SW_VERSION_NUM 0x10002 #define DBG_ENABLE #define DBG_SECTION_NAME "AT"