void esp8266_module::wifi_esp8266_socket_close(unsigned int sid) { CSTRING cmd; if(get_socket_state(sid)) { cmd.format("+CIPCLOSE=%u", sid); if(wifi_send_cmd(cmd.c_str(), 45) & WIFI_CMD_STATE_OK) { if( (sid < WIFI_ESP8266_MAX_SOCKETS) && alloc_sockets[sid]) { pending_socket = alloc_sockets[sid]; for(int i=0; i< 500; i++) { wifi_sleep(10); if(pending_socket->sock_state == SOCKET_OPEN) { TRACE_WIFI("\r\nUnlinked %d", sid); break; } } pending_socket = NULL; } } } }
RES_CODE esp8266_module::wifi_sock_disconect(CSocket* sock) { uint32_t sid; if(sock && sock->sock_id < WIFI_ESP8266_MAX_SOCKETS) { sid =sock->sock_id; if(alloc_sockets[sid] == sock && sock->sock_state == SOCKET_CONECTED) { wifi_esp8266_socket_close(sid); if(!get_socket_state(sid)) return RES_SIG_OK; } } return RES_SIG_ERROR; }
RES_CODE esp8266_module::wifi_sock_connect_url(CSocket* sock) { CSTRING cmd;; for(int try_cnt=0; sock && try_cnt <3; try_cnt++ ) { if(sock->sock_state & SOCKET_OPEN) { unsigned int sid = sock->sock_id; cmd.format("+CIPSTART=%u,\"%s\",\"%s\",%u", sid, (((sock_mode_t*)sock->mode.as_voidptr)->sock_type == IP_SOCKET_TCP)?"TCP":"UDP", sock->src.as_charptr, sock->dst.as_int); if (wifi_send_cmd(cmd.c_str(), 40) & WIFI_CMD_STATE_OK) { pending_socket = sock; for(int i=0; i<500; i++) { wifi_sleep(10); if(sock->sock_state == SOCKET_CONECTED) break; } pending_socket = NULL; received_size[sock->sock_id] = 0; if(sock->sock_state == SOCKET_CONECTED) { TRACE_WIFI("\r\nLink %d", sid); return RES_SIG_OK; } wifi_esp8266_socket_close(sid); } //Debug get_socket_state(sid); } else { wifi_net_error(NET_ERR_SOCK_CLOSED); return RES_SIG_ERROR; } } wifi_net_error(NET_ERR_SOCK_CONNECT); return RES_SIG_ERROR; }
void manage_socket_accesses_on_fdset(int *nfds, fd_set *initial_fds, fd_set *final_fds) { int fd, created_socket; int initial_nfds; initial_nfds = *nfds; FD_ZERO(final_fds); if (initial_fds != NULL) { for (fd = 0; fd < initial_nfds; fd++) { if (FD_ISSET(fd, initial_fds)) { FD_SET(fd, final_fds); if (test_if_fd_is_a_network_socket(fd) == 1) { if (get_socket_state(fd) == socket_state_listening) { created_socket = get_additional_listening_socket_if_needed(fd); if (created_socket != -1) { // a new socket was created, add it in the final_fds FD_SET(created_socket, final_fds); debug_print(1, "Created additional socket in order to wait on both IPv4 and IPv6 events.\n"); // update nfds if needed if (created_socket >= *nfds) { *nfds = created_socket +1; } } } } } } } }
void manage_socket_accesses_on_pollfd_table(int nfds, int *final_nfds, struct pollfd *fds, struct pollfd **final_fds) { int allocated, new_nfds, fd, index; int created_socket; allocated = nfds+2; *final_fds = realloc(*final_fds, allocated*sizeof(struct pollfd)); memcpy(*final_fds, fds, nfds*sizeof(struct pollfd)); new_nfds = nfds; for (index = 0; index < nfds; index++) { fd = fds[index].fd; if (test_if_fd_is_a_network_socket(fd) == 1) { if (get_socket_state(fd) == socket_state_listening) { created_socket = get_additional_listening_socket_if_needed(fd); if (created_socket != -1) { // a new socket was created, add it in the final_fds debug_print(1, "Created additional socket in order to wait on both IPv4 and IPv6 events.\n"); // enlarge the table if needed if (new_nfds == allocated) { allocated = 2*allocated; *final_fds = realloc(*final_fds, allocated*sizeof(struct pollfd)); } // copy the info and set the fd as the new socket memcpy(&(*final_fds)[new_nfds], &fds[index], sizeof(struct pollfd)); (*final_fds)[new_nfds].fd = created_socket; new_nfds ++; } } } } *final_nfds = new_nfds; }