Esempio n. 1
0
void Modo_Servidor() {
  string cmd;
  Conexao c;
  _Mensagem _msg;
  Mensagem msg = &_msg;
  bool encerra = false;

  try {
    c = Cria_Conexao ();                  // Inicializa conexao.
  }
  catch (string s_comando) { cout << s_comando; return; }

  while (!encerra)  {
    char buffer[256];
    cmd = "";
    Recebe_Msg(c,msg);

    while (msg->Tipo == TIPO_C) {
      strncpy(buffer, (char*) msg->dados, msg->Tamanho); // Guarda em 'buffer'
      buffer[msg->Tamanho] = '\0';                       // os dados da msg. (no caso, o comando)
      cmd = cmd + buffer;
      Limpa_Dados(msg);
      Recebe_Msg(c,msg);
    }
    Send_Command(cmd, c);
  }
}
Esempio n. 2
0
void Request_Command(string s_comando, Conexao c) {
  _Mensagem _msg, *msg;
  msg = &_msg;

  try {
    Manda_String(c, TIPO_C, s_comando.c_str()); // Envia um Comando 's'.
    Manda_String(c, TIPO_F, "");                // Final de Transmissao.

    Recebe_Msg(c,msg);
    if (msg->Tipo == TIPO_E) {         // Erro.
      cout << "Erro: Comando invalido." << endl;
      Limpa_Dados(msg);
      Recebe_Msg(c,msg);
    }
    while (msg->Tipo == TIPO_A) {      // Mostra na tela.
      Mostra_Tela(msg);
      Limpa_Dados(msg);
      Recebe_Msg(c,msg);
    }
    Limpa_Dados(msg);
  }
  catch (string err) {
    cout << err;
  }
}
Esempio n. 3
0
int Envia_P(int conexao,Quadro *p,int t){
    Quadro *q;
    int i,fim=FALSE,r=FALSE;
    unsigned char *buffer,cont=0;
    
    q=novo_quadro();
    Seta_Quadro(q,0x00);
    buffer=malloc(TAM_QUADRO*sizeof(char));
    
    printf("\n\nEnviando pacote  .... %d\n",t);                                             // enquanto não recebeu o ack
    Zera_Buffer(buffer);
    while(fim==FALSE){     
    		quadro2buffer(p,buffer);;
			
			send(conexao,buffer,TAM_QUADRO,0);
			 //r=valida_timeout(conexao);
			 //if(r==TRUE){
			    Recebe_Msg(conexao,q);
	            if(q->tipo==ACK) fim=TRUE;
	   //      }
	     //    else printf("problema na conexão\n");
	}
	printf("pacote %d enviado com sucesso\n",t);
    
    free(buffer);
    free(q);
}    
Esempio n. 4
0
int Recebe_Pacote(int conexao,char nome_arq[],int tipo){  //ls ou arq
    FILE *in;
    Quadro *q,*p;
    int i,cont=-1,k=-1,pacotes_rec=0,fim=FALSE,reenvio=FALSE,q_pacotes,j;
    char buffer[TAM_QUADRO];
    
    if(tipo==LS) in=fopen(nome_arq,"w");
    else in=fopen(nome_arq,"wb");
    
    q=novo_quadro();
    Seta_Quadro(q,0x00);
    p=novo_quadro();
    Seta_Quadro(p,0x00);
    
    //recebe atributos do arquivo
    Seta_Quadro(q,0x00);
    //Recebe_Msg(conexao,q);
    recv(conexao,buffer,TAM_QUADRO,0);
    buffer2quadro(buffer,q);
    printf("ATIBUTOS\n\t q->tipo == %d q->dados ==%s q->marca==%d\n",q->tipo,q->dados,q->marca);
    
    
    q_pacotes=atoi(q->dados);
    printf("total de pacotes a receber %d\n",q_pacotes);
    for(k=0;k<=q_pacotes+1;k++){
		    printf("recebendo pacote %d \n",k);
			Recebe_Msg(conexao,p);
			if(p->tipo==FIM){
			     printf("recebeu ultimo pacote\n");
					fim=TRUE;
					break;
			}
			else{
				if(retorna_crc(q)==TRUE){
					printf(" escrevendo em %s : [%s]\n",nome_arq,p->dados);
				    fprintf(in,"%s",p->dados);
					printf("enviando ack de %d\n",k);
					Seta_Quadro(q,ACK);
					quadro2buffer(q,buffer);
					Enviar(conexao,buffer);
				
				}
				else{
				   Seta_Quadro(q,NACK);
				   quadro2buffer(q,buffer);
				   Enviar(conexao,buffer);
				}
		   }
	        Seta_Quadro(p,0x00);
	}
    if(fim==TRUE) printf("ACABOU pq recebeu ultimo pacote!!!\n");
    else printf("ACABOU pq recebeu todos os pacotes esperados!!!\n");
    free(q);
	free(p);
	fclose(in);
    
    
    
}	
Esempio n. 5
0
void Send_Put(Conexao c) {
  _Mensagem _msg;
  Mensagem msg = &_msg;
	
  string descritor;
  string nome_arq;
  long tam_arq;
  char buffer[256];

  Recebe_Msg(c,msg);

  while (msg->Tipo == TIPO_9) {                  	// Descritor de Arquivo.
    strncpy(buffer, (char*) msg->dados, msg->Tamanho);  // Guarda em 'buffer'
    buffer[msg->Tamanho] = '\0';                        // os dados da msg.
    descritor = descritor + buffer;                     // <Nome_do_Arquivo>#<Tamanho>.
    Limpa_Dados(msg);
    Recebe_Msg(c,msg);
  }

  istringstream s_comando(descritor);
  getline(s_comando, nome_arq, '#');                    // Copia o nome do arquivo para 'nome_arq'. 
  s_comando >> tam_arq;


  FILE *arq;
  arq = fopen(nome_arq.c_str(), "w");
  if (arq == NULL) {
    Manda_String(c, TIPO_E, "");          // Erro.
    Manda_String(c, TIPO_A, "Erro: Nao foi possivel abrir o arquivo.\n");  // Mostra na tela do cliente.
    Manda_String(c, TIPO_F, "");          // Final de Transmissao.
  }
  else {
    Manda_String(c, TIPO_F, "");          // Final de Transmissao.
    Recebe_Msg(c,msg);

    while (msg->Tipo == TIPO_2) {                          // Dados.
      fwrite(msg->dados,sizeof(char), msg->Tamanho, arq);  // Comeca a copiar os arquivos.
      Limpa_Dados(msg);
      Recebe_Msg(c,msg);
    }
    fclose(arq);
    }
}
Esempio n. 6
0
int Comando_Terminal_Remoto(int conexao, char *param,int tipo){
    Quadro *q;
    char buffer[TAM_QUADRO],ini[1024];
      printf("comando terminal remoto\n");
     q=novo_quadro();
     Seta_Quadro(q,tipo);
     
     if(param!=NULL){
	    q->tam=strlen(param);
	    strcpy(q->dados,param);
	    printf(" parametro : %s\n",q->dados);
	 }
	 else{
		 q->tam=0;
	     strcpy(q->dados,"");
	 
	 }
	 quadro2buffer(q,buffer);
     printf("enviando solicitação de Rls ou Rcd\n");
     send(conexao,buffer,TAM_QUADRO,0); //enviou solicitação de ls ou cd
     //Enviar(conexao,buffer);
    
     
     if(tipo==LS){
	    Recebe_Pacote(conexao,".txls",LS);
	    system("clear");
        printf(" # LS Remoto :\n");
        sprintf(ini,"%s","cat .txls");
        system(ini);
     }
     else{
		 Seta_Quadro(q,0x00);
		 printf("Recebendo ack ou nachk de cd ...");
		 Recebe_Msg(conexao,q);
		 printf("recebeu %d\n",q->tipo);
		 
         if(q->tipo==ACK){
		     printf("diretótio alvo :\n\t/%s\n",param);
             system("clear");
          }
         else{
			  printf ("Diretório alvo não encontrado \n");
			 free(q);
			  return FALSE;
		  }
	 }
     free(q);  
     return TRUE;  
      
      
      
      
}
Esempio n. 7
0
int Arq_Get(int conexao,char *param){
	Quadro *q;
	int s=FALSE;
	unsigned char *buffer;
	
	
	
	 q=novo_quadro();
	 Seta_Quadro(q,GET);
	 buffer=malloc(TAM_QUADRO*sizeof(char));
	 
	 strcpy(q->dados,param);
	 q->tam=strlen(q->dados);
	 quadro2buffer(q,buffer);
	 printf("Enviando GET |%s|\n",q->dados);
     send(conexao,buffer,TAM_QUADRO,0);  // ENVIA SOLICITAÇÃO DE GET !!!!! =========>>>>>>
     printf("GET ENVIADO foi %d\n",q->tipo);
     // FUNÇÂO DE TEMPO ?????
      
     Seta_Quadro(q,0x00);
     Zera_Buffer_u(buffer); 
     printf("RECEBENDO ACK q->tipo %d\n",q->tipo);
     Recebe_Msg(conexao,q);
     printf("ACK veio %d MARCA[%d]\n",q->marca,q->tipo);  
    
     if(q->tipo==ACK){
		 printf(" ACK , trasferência permitida\n\t\t\nRECEBENDO PACOTES!!!!\n");
	     free(buffer);
	     free(q);
	     Recebe_Pacote(conexao,param,GET);
     }
     else {
		 printf("recebeu um nack,Arquivo não encontrado ou sem permissão\n");
		 free(buffer);
		 free(q);
		 return FALSE;
     }
    
   return TRUE;	
	
}
Esempio n. 8
0
int Conecta_CLIENTE(int conexao){
    Quadro *q;
    char buffer[TAM_QUADRO];
    
    q=novo_quadro();
    printf("recebendo ack do servidor\n");
    Recebe_Msg(conexao,q);
    printf("ok ... agora mandando ack\n");
    if(q->tipo==ACK){
		Seta_Quadro(q,ACK);
		quadro2buffer(q,buffer);
		send(conexao,buffer,TAM_QUADRO,0);
		printf("CONEXÃO pronta para uso\n");
	
	}	
    free(q);
        




}
Esempio n. 9
0
void Request_Get(string s_comando, Conexao c) {
  _Mensagem _msg, *msg;
  msg = &_msg;

  try {
    Manda_String(c, TIPO_C, s_comando.c_str()); // Envia um Comando 's'.
    Manda_String(c, TIPO_F, "");        // Final de Transmissao.

    Recebe_Msg(c,msg);
    if (msg->Tipo == TIPO_E) {        // Erro.
      cout << "Erro na execucao do comando: " << endl;
      Limpa_Dados(msg);
      Recebe_Msg(c,msg);
		
      while (msg->Tipo == TIPO_A) {   // Mostra na tela.
        Mostra_Tela(msg);
        Limpa_Dados(msg);
        Recebe_Msg(c,msg);
      }
      Limpa_Dados(msg);
    }
    else {
      string descritor;
      string nome_arq;
      long tam_arq;
      char buffer[256];

      while (msg->Tipo == TIPO_9) {                         // Descritor do arquivo.
        strncpy(buffer, (char*) msg->dados, msg->Tamanho);  // Guarda em 'buffer'
        buffer[msg->Tamanho] = '\0';                        // os dados da msg.
        descritor = descritor + buffer;   // <Nome do arquivo>#<Tamanho>.
        Limpa_Dados(msg);
        Recebe_Msg(c,msg);
      }

      istringstream s_comando(descritor);
      getline(s_comando,nome_arq,'#');            // Copia o nome do arquivo para 'nome_arq'.
      s_comando >> tam_arq;
      
      
      FILE *arq;
      arq = fopen(nome_arq.c_str(), "w");
      if (arq == NULL) {
        Manda_String(c, TIPO_E, "");
        cout << "Erro: Nao foi possivel abrir o arquivo" << endl;;
      }
      else {
        Manda_String(c, TIPO_F, "");                            // Final de Transmissao.
        Recebe_Msg(c,msg);
        while (msg->Tipo == TIPO_2) {                           // Dados.
          fwrite(msg->dados,sizeof(char), msg->Tamanho, arq);   // Comeca a copiar o arquivo.
          Limpa_Dados(msg);
          Recebe_Msg(c,msg);
        }
        fclose(arq);
      }
    }
  }
  catch (string err) {
    cout << err;
  }
}
Esempio n. 10
0
void Send_Get(string s_comando, Conexao c) {
  _Mensagem _msg, *msg;
  msg = &_msg;

  try {
    istringstream aux_string(s_comando);
    string cmd;
    string descritor, nome_arq;
    long tamanho_arq;
    char ch;

    aux_string >> cmd;
    aux_string.get(ch);

    char tam_arq [16];
    getline(aux_string, nome_arq);                  // Copia o comando para 'nome_arq'.
                                                   // (Para saber o nome do arquivo pelos parametros)
	
    struct stat buf;                               // Pega as informacoes do arquivo
    int result = stat(nome_arq.c_str(),&buf);      // e os guarda em 'buf'.

    if (result == -1 || !S_ISREG(buf.st_mode)) {   // Checka o tipo e as permissoes do arquivo.
      string msg_erro;
      if (result == -1)	
        msg_erro = "Erro: '" + nome_arq + "' nao encontrado.\n";
      else
        msg_erro = "Erro: Voce nao tem permissao para alterar o arquivo '" + nome_arq + "' .\n";
      Manda_String(c, TIPO_E, "");                        // Erro.
      Manda_String(c, TIPO_A, msg_erro.c_str());          // Mostra na tela do cliente o erro apropriado.
      Manda_String(c, TIPO_F, "");                        // Final de Transmissao.
      return;
    }
    FILE *arq = fopen(nome_arq.c_str(),"r");
    if (arq == NULL) {
      string msg_erro = "Erro: nao foi possivel abrir o arquivo '" + nome_arq + "'.\n";
      Manda_String(c, TIPO_E, "");                        // Erro.
      Manda_String(c, TIPO_A, msg_erro.c_str());          // Mostra na tela do cliente o erro apropriado.
      Manda_String(c, TIPO_F, "");                        // Final de Transmissao.
      return;
    }
    fseek(arq,0,SEEK_END);
    tamanho_arq = ftell(arq);
    fseek(arq,0,SEEK_SET);

    snprintf(tam_arq, 15, "%ld",tamanho_arq);
    descritor = nome_arq + "#" + tam_arq;                 // <Nome_do_arquivo>#<Tamanho>
    Manda_String(c,TIPO_9, descritor.c_str());            // Descritor do Arquivo.
    Manda_String(c, TIPO_F, "");                          // Final de Transmissao.

    Recebe_Msg(c,msg);

    if (msg->Tipo == TIPO_E) {                 // Um Erro aqui nao interessa para
      Limpa_Dados(msg);                        // o servidor.
      return;
    }
    else {
      Manda_Arquivo(c, arq);
      Manda_String(c, TIPO_F,"");              // Final de Transmissao.
    }
  }
  catch (string err) {
    cout << err;
  }
}
Esempio n. 11
0
void Request_Put(string s_comando, Conexao c) {
  _Mensagem _msg, *msg;
  msg = &_msg;

  try {
    istringstream aux_string(s_comando);
    string cmd;
    string descritor, nome_arq;
    long tamanho_arq;
    char ch;

    aux_string >> cmd;
    aux_string.get(ch);

    char tam_arq [16];
    getline(aux_string, nome_arq);            // Copia o comando para 'nome_arq'.
		
    struct stat stat_buffer;                            // Pega informacoes do arquivo
    int result = stat(nome_arq.c_str(),&stat_buffer);   // e os guarda em 'buf'.

    if (result == -1 || !S_ISREG(stat_buffer.st_mode)) {       // Checka o tipo e as permissoes do arquivo.
      string msg_erro;
      if (result == -1)	
        cout << "Erro: '" + nome_arq + "' nao encontrado." << endl;
      else
        cout << "Erro: Voce nao tem permissao para alterar o arquivo '" + nome_arq + "'." << endl;
      return;
    }
    
    FILE *arq = fopen(nome_arq.c_str(),"r");

    if (arq == NULL) {
      cout << "Erro: Nao foi possivel abrir o arquivo '" << nome_arq << "'" << endl;
      return;
    }
    fseek(arq,0,SEEK_END);
    tamanho_arq = ftell(arq);
    fseek(arq,0,SEEK_SET);

    Manda_String(c, TIPO_C, cmd.c_str());     // Envia comando.
    Manda_String(c, TIPO_F, "");              // Final de Transmissao.

    snprintf(tam_arq, 15, "%ld",tamanho_arq);
    descritor = nome_arq + "#" + tam_arq;
    Manda_String(c,TIPO_9, descritor.c_str()); // Descritor do arquivo.
    Manda_String(c, TIPO_F, "");               // Final de Transmissao.

    Recebe_Msg(c,msg);

    if (msg->Tipo == TIPO_E) {                 // Erro.
      cout << "Erro na execucao do comando:" << endl;
      Limpa_Dados(msg);
      Recebe_Msg(c,msg);

      while (msg->Tipo == TIPO_A) {            // Mostra na Tela.
        Mostra_Tela(msg);
        Limpa_Dados(msg);
        Recebe_Msg(c,msg);
      }
      Limpa_Dados(msg);
    }
    else {
      Manda_Arquivo(c, arq);
      Manda_String(c, TIPO_F,"");             // Final de Transmissao.
    }
  }
  catch (string err) {
    cout << err;
  }
}
Esempio n. 12
0
int a_remoto(){
	Quadro *q,*p;
	int conexao=Rawsocket();
	unsigned char *buffer;
	int tipo,i,ret=FALSE;

	q=novo_quadro();
	Seta_Quadro(q,0x00);
	p=novo_quadro();
	Seta_Quadro(p,0x00);
    buffer=malloc(TAM_QUADRO*sizeof(char));
	 
	Conecta_SERVIDOR(conexao);
    
     Recebe_Msg(conexao,q);
     
      while(q->tipo!=FIM){
		if(q->tipo==LS){
	       printf("recebeu solicitação de ls remoto\n");
	       ls_remoto(q->dados);
	       printf("arquivo do RLS criado\n");
	       Monta_Pacotes(conexao,"Rls.txt",tipo);   
	    }
	   else if(q->tipo==GET){
	    	printf("recebeu solicitação de get -|%s|- ",q->dados);
 	        ret=find(q->dados);
	     
	      if(ret==TRUE){
			 Seta_Quadro(p,ACK);
			 Zera_Buffer(buffer);
			 quadro2buffer(p,buffer);
			 printf("Enviando ACK\n ");
			 send(conexao,buffer,TAM_QUADRO,0);
		     printf("ACK foi %d\n",q->tipo);
		     Monta_Pacotes(conexao,q->dados,tipo);
	       }
	       else{
		     Seta_Quadro(p,NACK);
	         Zera_Buffer(buffer);
			 quadro2buffer(p,buffer);
			 printf("Enviando NACK\n ");
			 send(conexao,buffer,TAM_QUADRO,0);
			 printf("Arquivo %s nao encontrado!!!!\n",q->dados);
	       }
	  }
	  else if(q->tipo==PUT){
		 printf(" Recebendo Arquivo |%s| \n",q->dados);
	     Recebe_Pacote(conexao,q->dados,PUT);
	  
	  }
	  else if(q->tipo==CD){
		  printf("Rcebeu solicitação de CD\n");
		 
		  if(cd(q->dados)==-1) Seta_Quadro(q,NACK);
		  else Seta_Quadro(q,ACK);	  
		  quadro2buffer(q,buffer);
		  send(conexao,buffer,TAM_QUADRO,0);
	  }  	
      Seta_Quadro(q,0x00);
      Recebe_Msg(conexao,q);
	}
	
	
	
	
return 0;	
}