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); } }
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; } }
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); }
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); }
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); } }
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; }
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; }
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); }
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; } }
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; } }
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; } }
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; }