Пример #1
0
int main()
{
	char *localhost = "10.255.20.160";
	int port = 44324;
	int err = 0;
	int server_sock, client_sock;

	err = tcp_stream_server(localhost, port, 1, &server_sock);
	if (err < 0)
	{
		printf("open tcp server socket failed\n");
		return 0;
	}

	while (1)
	{
		err = tcp_stream_accept(server_sock, &client_sock);
		if (!err)
		{
			printf("tcp server accept successfully\n");
		}
		else
		{
			continue;
		}
		tcp_socket_close(client_sock);
	}
	tcp_socket_close(server_sock);
	return 0;
}
Пример #2
0
/*---------------------------------------------------------------------------*/
static void
disconnect_tcp(struct mqtt_connection *conn)
{
  conn->state = MQTT_CONN_STATE_DISCONNECTING;
  tcp_socket_close(&(conn->socket));
  tcp_socket_unregister(&conn->socket);

  memset(&conn->socket, 0, sizeof(conn->socket));
}
Пример #3
0
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(http_socket_process, ev, data)
{
  PROCESS_BEGIN();

  while(1) {

    PROCESS_WAIT_EVENT();

    if(ev == resolv_event_found && data != NULL) {
      struct http_socket *s;
      const char *name = data;
      /* Either found a hostname, or not. We need to go through the
	 list of http sockets and figure out to which connection this
	 reply corresponds, then either restart the HTTP get, or kill
	 it (if no hostname was found). */
      for(s = list_head(socketlist);
          s != NULL;
          s = list_item_next(s)) {
        char host[MAX_HOSTLEN];
        if(s->did_tcp_connect) {
          /* We already connected, ignored */
        } else if(parse_url(s->url, host, NULL, NULL) &&
            strcmp(name, host) == 0) {
          if(resolv_lookup(name, NULL) == RESOLV_STATUS_CACHED) {
            /* Hostname found, restart get. */
            start_request(s);
          } else {
            /* Hostname not found, kill connection. */
            call_callback(s, HTTP_SOCKET_HOSTNAME_NOT_FOUND, NULL, 0);
            removesocket(s);
          }
        }
      }
    } else if(ev == PROCESS_EVENT_TIMER) {
      struct http_socket *s;
      struct etimer *timeout_timer = data;
      /*
       * A socket time-out has occurred. We need to go through the list of HTTP
       * sockets and figure out to which socket this timer event corresponds,
       * then close this socket.
       */
      for(s = list_head(socketlist);
          s != NULL;
          s = list_item_next(s)) {
        if(timeout_timer == &s->timeout_timer && s->timeout_timer_started) {
          tcp_socket_close(&s->s);
          break;
        }
      }
    }
  }

  PROCESS_END();
}
Пример #4
0
/*---------------------------------------------------------------------------*/
int
http_socket_close(struct http_socket *socket)
{
  struct http_socket *s;
  for(s = list_head(socketlist);
      s != NULL;
      s = list_item_next(s)) {
    if(s == socket) {
      tcp_socket_close(&s->s);
      removesocket(s);
      return 1;
    }
  }
  return 0;
}
Пример #5
0
/*---------------------------------------------------------------------------*/
static void
abort_connection(struct mqtt_connection *conn)
{
  conn->out_buffer_ptr = conn->out_buffer;
  conn->out_queue_full = 0;

  /* Reset outgoing packet */
  memset(&conn->out_packet, 0, sizeof(conn->out_packet));

  tcp_socket_close(&conn->socket);
  tcp_socket_unregister(&conn->socket);

  memset(&conn->socket, 0, sizeof(conn->socket));

  conn->state = MQTT_CONN_STATE_NOT_CONNECTED;
}
Пример #6
0
/*---------------------------------------------------------------------------*/
static int
input_pt(struct http_socket *s,
         const uint8_t *inputptr, int inputdatalen)
{
  int i;
  PT_BEGIN(&s->pt);

  /* Parse the header */
  s->header_received = 0;
  do {
    for(i = 0; i < inputdatalen; i++) {
      if(!PT_SCHEDULE(parse_header_byte(s, inputptr[i]))) {
        s->header_received = 1;
        break;
      }
    }
    inputdatalen -= i;
    inputptr += i;

    if(s->header_received == 0) {
      /* If we have not yet received the full header, we wait for the
         next packet to arrive. */
      PT_YIELD(&s->pt);
    }
  } while(s->header_received == 0);

  s->bodylen = 0;
  do {
    /* Receive the data */
    call_callback(s, HTTP_SOCKET_DATA, inputptr, inputdatalen);

    /* Close the connection if the expected content length has been received */
    if(s->header.content_length >= 0 && s->bodylen < s->header.content_length) {
      s->bodylen += inputdatalen;
      if(s->bodylen >= s->header.content_length) {
        tcp_socket_close(&s->s);
      }
    }

    PT_YIELD(&s->pt);
  } while(inputdatalen > 0);

  PT_END(&s->pt);
}
Пример #7
0
/*---------------------------------------------------------------------------*/
static int
parse_header_byte(struct http_socket *s, char c)
{
  PT_BEGIN(&s->headerpt);

  memset(&s->header, -1, sizeof(s->header));

  /* Skip the HTTP response */
  while(c != ' ') {
    PT_YIELD(&s->headerpt);
  }

  /* Skip the space */
  PT_YIELD(&s->headerpt);
  /* Read three characters of HTTP status and convert to BCD */
  s->header.status_code = 0;
  for(s->header_chars = 0; s->header_chars < 3; s->header_chars++) {
    s->header.status_code = s->header.status_code << 4 | (c - '0');
    PT_YIELD(&s->headerpt);
  }

  if(s->header.status_code == 0x200 || s->header.status_code == 0x206) {
    /* Read headers until data */

    while(1) {
      /* Skip characters until end of line */
      do {
        while(c != '\r') {
          s->header_chars++;
          PT_YIELD(&s->headerpt);
        }
        s->header_chars++;
        PT_YIELD(&s->headerpt);
      } while(c != '\n');
      s->header_chars--;
      PT_YIELD(&s->headerpt);

      if(s->header_chars == 0) {
        /* This was an empty line, i.e. the end of headers */
        break;
      }

      /* Start of line */
      s->header_chars = 0;

      /* Read header field */
      while(c != ' ' && c != '\t' && c != ':' && c != '\r' &&
            s->header_chars < sizeof(s->header_field) - 1) {
        s->header_field[s->header_chars++] = c;
        PT_YIELD(&s->headerpt);
      }
      s->header_field[s->header_chars] = '\0';
      /* Skip linear white spaces */
      while(c == ' ' || c == '\t') {
        s->header_chars++;
        PT_YIELD(&s->headerpt);
      }
      if(c == ':') {
        /* Skip the colon */
        s->header_chars++;
        PT_YIELD(&s->headerpt);
        /* Skip linear white spaces */
        while(c == ' ' || c == '\t') {
          s->header_chars++;
          PT_YIELD(&s->headerpt);
        }
        if(!strcmp(s->header_field, "Content-Length")) {
          s->header.content_length = 0;
          while(isdigit((int)c)) {
            s->header.content_length = s->header.content_length * 10 + c - '0';
            s->header_chars++;
            PT_YIELD(&s->headerpt);
          }
        } else if(!strcmp(s->header_field, "Content-Range")) {
          /* Skip the bytes-unit token */
          while(c != ' ' && c != '\t') {
            s->header_chars++;
            PT_YIELD(&s->headerpt);
          }
          /* Skip linear white spaces */
          while(c == ' ' || c == '\t') {
            s->header_chars++;
            PT_YIELD(&s->headerpt);
          }
          s->header.content_range.first_byte_pos = 0;
          while(isdigit((int)c)) {
            s->header.content_range.first_byte_pos =
              s->header.content_range.first_byte_pos * 10 + c - '0';
            s->header_chars++;
            PT_YIELD(&s->headerpt);
          }
          /* Skip linear white spaces */
          while(c == ' ' || c == '\t') {
            s->header_chars++;
            PT_YIELD(&s->headerpt);
          }
          if(c == '-') {
            /* Skip the dash */
            s->header_chars++;
            PT_YIELD(&s->headerpt);
            /* Skip linear white spaces */
            while(c == ' ' || c == '\t') {
              s->header_chars++;
              PT_YIELD(&s->headerpt);
            }
            s->header.content_range.last_byte_pos = 0;
            while(isdigit((int)c)) {
              s->header.content_range.last_byte_pos =
                s->header.content_range.last_byte_pos * 10 + c - '0';
              s->header_chars++;
              PT_YIELD(&s->headerpt);
            }
            /* Skip linear white spaces */
            while(c == ' ' || c == '\t') {
              s->header_chars++;
              PT_YIELD(&s->headerpt);
            }
            if(c == '/') {
              /* Skip the slash */
              s->header_chars++;
              PT_YIELD(&s->headerpt);
              /* Skip linear white spaces */
              while(c == ' ' || c == '\t') {
                s->header_chars++;
                PT_YIELD(&s->headerpt);
              }
              if(c != '*') {
                s->header.content_range.instance_length = 0;
                while(isdigit((int)c)) {
                  s->header.content_range.instance_length =
                    s->header.content_range.instance_length * 10 + c - '0';
                  s->header_chars++;
                  PT_YIELD(&s->headerpt);
                }
              }
            }
          }
        }
      }
    }

    /* All headers read, now read data */
    call_callback(s, HTTP_SOCKET_HEADER, (void *)&s->header, sizeof(s->header));

    /* Should exit the pt here to indicate that all headers have been
       read */
    PT_EXIT(&s->headerpt);
  } else {
    if(s->header.status_code == 0x404) {
      puts("File not found");
    } else if(s->header.status_code == 0x301 || s->header.status_code == 0x302) {
      puts("File moved (not handled)");
    }

    call_callback(s, HTTP_SOCKET_ERR, (void *)&s->header, sizeof(s->header));
    tcp_socket_close(&s->s);
    removesocket(s);
    PT_EXIT(&s->headerpt);
  }


  PT_END(&s->headerpt);
}
Пример #8
0
/*---------------------------------------------------------------------------*/
static void
disconnect_tcp(struct mqtt_connection* conn)
{
  conn->state = MQTT_CONN_STATE_DISCONNECTING;
  tcp_socket_close(&(conn->socket));
}
Пример #9
0
static void http_control_process(int soc_handler,char event,char *srcipaddr,unsigned short srcport,
                                     unsigned short data_index, unsigned short data_len) {
  int resp;

  switch(event) {
    case TCP_EVENT_CONN_REQ:
      if (debug_http)
        printf("Connection Request from IP: %d.%d.%d.%d - Port: %d\n",
	       *srcipaddr,*(srcipaddr+1),*(srcipaddr+2),*(srcipaddr+3),srcport);
      resp = tcp_conn_accept(soc_handler);
      if (resp == TCP_SOCKET_ERROR)
	  	printf("Accept Error: no free socket available\n");

      else 
	  {		
	   
        if (debug_http)
	  		printf("Socket %d created\n", resp);
	  
      }
      break;
    case TCP_EVENT_ESTABLISHED:
	
      if (debug_http)
	  	
        printf("Connection Established with IP: %d.%d.%d.%d - Port: %d\n",
	       *srcipaddr,*(srcipaddr+1),*(srcipaddr+2),*(srcipaddr+3),srcport);
		
      break;
    case TCP_EVENT_DATA:
      if (debug_http)
        printf("Event: Data Available from IP: %d.%d.%d.%d - Port: %d\n",
	       *srcipaddr,*(srcipaddr+1),*(srcipaddr+2),*(srcipaddr+3),srcport);
      resp = HTTP_process(data_index, data_len);	
      file_index[soc_handler-1] = resp;		
      if (debug_http_file) {
	if (resp == -2)
	  printf("Serving: 501 Command Not Implemented!\n");
    else if (resp == -1)
	  printf("Serving: 404 Page Not Found!\n");	
	else 
	  printf("Serving file %s\n", filesystem[resp].filename);
	  printf("Serving size %d\r\n", filesystem[resp].filesize);

	  
      }
      	if (tcp_send_data(soc_handler, create_content) == TCP_SOCKET_ERROR)
	 		 	printf("Error sending data: TCP already have data to send!\r\n");

      break;
    case TCP_EVENT_SEND_COMPLETED:
      tcp_conn_close(soc_handler);		
      break;
    case TCP_EVENT_CONN_CLOSED:
      tcp_socket_close(soc_handler);
      if (debug_http)
	  printf("Socket %d closed\n", soc_handler);

      break;
    case TCP_EVENT_RESET:
      if (debug_http)     
	  printf("Error: Socket %d was Reset\r\n", soc_handler);
		tcp_conn_close(soc_handler);
      break;
    case TCP_EVENT_rTOUT:
		tcp_conn_close(soc_handler);
	printf("Error: Socket %d Timed Out\r\n", soc_handler);
      break;
    case TCP_EVENT_cTOUT:
	  printf("Error: Connection in socket %d Timed Out\r\n", soc_handler);

      break;
    case TCP_EVENT_CLOSE_REQ:
		tcp_conn_close(soc_handler);
      break;  	  	    	
    default:
	  printf("Unknown Event: %d\n",event);
      break;
  }
}