Пример #1
0
int main (){
  printf("Lora Fabian gateway running...\n");
  setup();
  while(1){
    loop();
    checkRequest();
  }
  return (0);
}
Пример #2
0
// Do HTTP method.
void UploadFileServlet::doMethod(IHttpServletRequest& request, IHttpServletResponse& response){
	if (!checkRequest(request, response)){
		return;
	}
	// Create the file. The current file will be overrided.
	std::string name = request.getParameter("file_name");
	createFolderForFile(folder + name);
	std::ofstream fout;
	fout.open(folder + name, std::ofstream::out | std::ofstream::binary);
	if (!fout){
		response.sendErrorWithMessage(500, "Cannot open the file.");
		return;
	}
	// Read input
	bool error = true;
	std::istream& in = request.getInputStream();
	std::string chunkSizeLine;
	std::string tmp;
	int chunkSize;
	std::getline(in, chunkSizeLine);
	char* buf = NULL;
	int bufSize = 0;
	while (in){
		if (!readOneChunk(in, chunkSize, chunkSizeLine, error, buf, bufSize, fout, response)){
			break;
		}
		// Read the next chunk
		std::getline(in, chunkSizeLine);
	}
	if (buf != NULL){
		delete buf;
	}
	// close the file
	fout.close();
	// Send error if occurred
	if (error){
		if (!response.isCommitted()){
			response.sendErrorWithMessage(400, "Wrong chunked format");
		}
		// throw an exception to close connection
		throw std::logic_error("Wrong chunked format");
	}
	else{
		LOG(INFO) << "Saved the file \"" << folder << name << "\".";
	}
}
Пример #3
0
// PUBLIC METHOD
// triggered by any change to the calibrator request variable  
void EyeCalibrator::notifyRequest(const Datum& dictionaryData, MWTime timeUS) {
    
	lock(); // DDC added
	
    // check if this calibrator should respond
	bool validRequest = checkRequest(dictionaryData);     // base class method (minimal checking)
    if (!validRequest){
		unlock(); // DDC added
		return;                          // not meant for this calibrator or improperly formatted
    }
	
    // determine the requested action

    CalibratorRequestedAction requestedAction = getRequestedAction(dictionaryData);  // overridable base class method
         
    switch (requestedAction) {
    
        case CALIBRATOR_NO_ACTION:
            mwarning(M_SYSTEM_MESSAGE_DOMAIN,
                    "Request sent to calibrator %s resulted in no action.", uniqueCalibratorName.c_str());
                unlock(); // DDC added
				return;
            break;
    
        case CALIBRATOR_ACTION_SET_PARAMS_TO_DEFAULTS:
                //mwarning(M_SYSTEM_MESSAGE_DOMAIN,
                //    "Request to update params sent to calibrator %s, BUT METHOD NOT YET WRITTEN. Request ignored.", uniqueCalibratorName);
                if (VERBOSE_EYE_CALIBRATORS) mprintf("An eye calibrator is processing a request to set its parameters to defaults."); 
                setParametersToDefaults(); 
                break;
            break;

        case CALIBRATOR_ACTION_SET_PARAMS_TO_CONTAINED:
            if (VERBOSE_EYE_CALIBRATORS) mprintf("An eye calibrator is processing a request to set its parameters to specific values."); 
            tryToUseDataToSetParameters(dictionaryData);      
            break;
        
    }
	
	unlock(); // DDC added
}
Пример #4
0
/**
*INICIO DO PROGRAMA PRINCIPAL
*/
int main (int argc, char **argv) {
   /* Os sockets. Um que será o socket que vai escutar pelas conexões
    * e o outro que vai ser o socket específico de cada conexão */
	int listenfd, connfd;
   /* Informações sobre o socket (endereço e porta) ficam nesta struct */
	struct sockaddr_in servaddr;
   /* Retorno da função fork para saber quem é o processo filho e quem
    * é o processo pai */
   pid_t childpid;
   /* Armazena linhas recebidas do cliente */
	char	recvline[MAXLINE + 1];
   /* Armazena o tamanho da string lida do cliente */
   ssize_t  n;

	if (argc != 2) {
      fprintf(stderr,"Uso: %s <Porta>\n",argv[0]);
      fprintf(stderr,"Vai rodar um servidor HTTP <Porta> TCP\n");
		exit(1);
	}

   /* Criação de um socket. Eh como se fosse um descritor de arquivo. Eh
    * possivel fazer operacoes como read, write e close. Neste
    * caso o socket criado eh um socket IPv4 (por causa do AF_INET),
    * que vai usar TCP (por causa do SOCK_STREAM), já que o HTTP
    * funciona sobre TCP, e será usado para uma aplicação convencional sobre
    * a Internet (por causa do número 0) */
	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("socket :(\n");
		exit(2);
	}

   /* Agora é necessário informar os endereços associados a este
    * socket. É necessário informar o endereço / interface e a porta,
    * pois mais adiante o socket ficará esperando conexões nesta porta
    * e neste(s) endereços. Para isso é necessário preencher a struct
    * servaddr. É necessário colocar lá o tipo de socket (No nosso
    * caso AF_INET porque é IPv4), em qual endereço / interface serão
    * esperadas conexões (Neste caso em qualquer uma -- INADDR_ANY) e
    * qual a porta. Neste caso será a porta que foi passada como
    * argumento no shell (atoi(argv[1]))
    */
	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port        = htons(atoi(argv[1]));
	if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
		perror("bind :(\n");
		exit(3);
	}

   /* Como este código é o código de um servidor, o socket será um
    * socket passivo. Para isto é necessário chamar a função listen
    * que define que este é um socket de servidor que ficará esperando
    * por conexões nos endereços definidos na função bind. */
	if (listen(listenfd, LISTENQ) == -1) {
		perror("listen :(\n");
		exit(4);
	}
   system("clear");
   printf("[Servidor no ar. Aguardando conexoes na porta %s]\n",argv[1]);
   printf("[Para finalizar, pressione CTRL+c ou rode um kill ou killall]\n");

   /* O servidor no final das contas é um loop infinito de espera por
    * conexões e processamento de cada uma individualmente */
	for (;;) {
      /* O socket inicial que foi criado é o socket que vai aguardar
       * pela conexão na porta especificada. Mas pode ser que existam
       * diversos clientes conectando no servidor. Por isso deve-se
       * utilizar a função accept. Esta função vai retirar uma conexão
       * da fila de conexões que foram aceitas no socket listenfd e
       * vai criar um socket específico para esta conexão. O descritor
       * deste novo socket é o retorno da função accept. */
		if ((connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) == -1 ) {
			perror("accept :(\n");
			exit(5);
		}

      /* Agora o servidor precisa tratar este cliente de forma
       * separada. Para isto é criado um processo filho usando a
       * função fork. O processo vai ser uma cópia deste. Depois da
       * função fork, os dois processos (pai e filho) estarão no mesmo
       * ponto do código, mas cada um terá um PID diferente. Assim é
       * possível diferenciar o que cada processo terá que fazer. O
       * filho tem que processar a requisição do cliente. O pai tem
       * que voltar no loop para continuar aceitando novas conexões */
      /* Se o retorno da função fork for zero, é porque está no
       * processo filho. */
      if ( (childpid = fork()) == 0) {
         /**** PROCESSO FILHO ****/
         printf("[Uma conexao aberta]\n");
         /* Já que está no processo filho, não precisa mais do socket
          * listenfd. Só o processo pai precisa deste socket. */
         close(listenfd);

         /* Agora pode ler do socket e escrever no socket. Isto tem
          * que ser feito em sincronia com o cliente. Não faz sentido
          * ler sem ter o que ler. Ou seja, neste caso está sendo
          * considerado que o cliente vai enviar algo para o servidor.
          * O servidor vai processar o que tiver sido enviado e vai
          * enviar uma resposta para o cliente (Que precisará estar
          * esperando por esta resposta)
          */

         /* ========================================================= */
         /* ========================================================= */
         /*                         EP1 INÍCIO                        */
         /* ========================================================= */
         /* ========================================================= */
         /* TODO: É esta parte do código que terá que ser modificada
          * para que este servidor consiga interpretar comandos HTTP */

         /* Definindo o cliente */
         Host cliente;
         cliente.destino = servaddr;
         cliente.socket = connfd;

         /* Ler a requisição do cliente*/
         Request client_request = readRequest(cliente);

         /* Mostrar na tela as requisições dos clientes */
         printf("*********************************************************************");
         printf("\n [Metodo requisitado]:   %s \n", client_request.metodo);
         printf("\n [Recurso solicitado]:   %s \n", client_request.recurso);
         printf("\n [Protocolo]:            %s \n", client_request.protocolo);

         /* checar a Request do client */
         CR_returns returns =  checkRequest(cliente, client_request);

         /* enviar resposta da requisição para o cliente */
         if (strcmp(client_request.metodo,"GET")==0) {
            sendGETRequest(cliente, returns);
         }
         else if (strcmp(client_request.metodo,"POST")==0) {
            sendPOSTRequest(cliente, returns,client_request);

         }

         /* ========================================================= */
         /* ========================================================= */
         /*                         EP1 FIM                           */
         /* ========================================================= */
         /* ========================================================= */

         /* Após ter feito toda a troca de informação com o cliente,
          * pode finalizar o processo filho */
         printf("[Uma conexao fechada]\n");
         exit(0);
      }
      /**** PROCESSO PAI ****/
      /* Se for o pai, a única coisa a ser feita é fechar o socket
       * connfd (ele é o socket do cliente específico que será tratado
       * pelo processo filho) */
		close(connfd);
	}
	exit(0);
}
Пример #5
0
//===== Main program =========================================================
int main() {
  #ifdef WIN
	WORD wVersionRequested = MAKEWORD(1, 1); // Stuff for WSA functions
	WSADATA wsaData; // Stuff for WSA functions
	#endif
	int server_s; // Server socket descriptor
	struct sockaddr_in server_addr; // Server Internet address
	struct sockaddr_in client_addr; // Client Internet address
	int addr_len; // Internet address length
	char out_buf[4096]; // Output buffer for data
	char in_buf[4096]; // Input buffer for data
	int retcode; // Return code
	#ifdef WIN
	// This stuff initializes winsock
	WSAStartup(wVersionRequested, & wsaData);
  #endif
	// Create a socket
	server_s = socket(AF_INET, SOCK_DGRAM, 0);
	if (server_s < 0) {
		printf("*** ERROR - socket() failed \n");
		exit(-1);
	}
	// Fill-in my socket's address information
	server_addr.sin_family = AF_INET; // Address family to use
	server_addr.sin_port = htons(PORT_NUM); // Port number to use
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // Listen on any IP address
	retcode = bind(server_s, (struct sockaddr * ) & server_addr,
	sizeof(server_addr));
	if (retcode < 0) {
		printf("*** ERROR - bind() failed \n");
		exit(-1);
	}
	
	FILE *file;
	
	//Loop forever
	while (1) {
		//open file
		file = fopen("usernames.txt", "a+");

		// Wait to receive a message from client
		printf("Waiting for recvfrom() to complete... \n");
		addr_len = sizeof(client_addr);
		retcode = recvfrom(server_s, in_buf, sizeof(in_buf), 0, (struct sockaddr * ) & client_addr, & addr_len);
		if (retcode < 0) {
			printf("*** ERROR - recvfrom() failed \n");
			exit(-1);
		}
		printf(" Received from client: %s \n", in_buf);
    
    	char buffer[400];
    	char *test = buffer;
		
		switch(checkRequest(in_buf))
		{
			case 1:
				if(testString(&in_buf))
				{
					fprintf(file, "%s\n", in_buf);
					sprintf(buffer, "ROK;");
					strcpy(out_buf, buffer);
				}
				else
				{
					sprintf(buffer, "INU;");
					strcpy(out_buf, buffer);
				}
				break; 
			case 2:
				
				break;
			case 3:
				
				break;
			case 4:
				
				break;
		}
		
		fclose(file);

		// Send out_buf to the client using the server socket
		retcode = sendto(server_s, out_buf, (strlen(out_buf) + 1), 0, (struct sockaddr * ) & client_addr, sizeof(client_addr));
		if (retcode < 0) {
			printf("*** ERROR - sendto() failed \n");
			exit(-1);
		}
		printf(" Sent to client: %s \n", out_buf);
	}
	// Close all open sockets
	#ifdef WIN
	retcode = closesocket(server_s);
	if (retcode < 0) {
		printf("*** ERROR - closesocket() failed \n");
		exit(-1);
	}
  #endif
  #ifdef BSD
	retcode = close(server_s);
	if (retcode < 0) {
		printf("*** ERROR - close() failed \n");
		exit(-1);
	}
  #endif
  #ifdef WIN
	// This stuff cleans-up winsock
	WSACleanup();
  #endif
	// Return zero and terminate
	return (0);
}