Example #1
0
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;
			}
		}
	}
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
							}
						}
					}
				}
			}
		}
	}
}
Example #5
0
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;
}