From 03c70322319f8082ff37d2f879033ba84044f94b Mon Sep 17 00:00:00 2001 From: Victor Perszel <vlp14@inf.ufpr.br> Date: Sun, 29 Nov 2015 17:13:43 -0200 Subject: [PATCH] SendCD --- include/messages.h | 8 +++- src/messages.cpp | 112 +++++++++++++++++++++++++++++++++------------ 2 files changed, 90 insertions(+), 30 deletions(-) diff --git a/include/messages.h b/include/messages.h index 2f07379..b31d555 100644 --- a/include/messages.h +++ b/include/messages.h @@ -13,6 +13,10 @@ class Message{ SubMessage messages[3]; // Janela deslizante permite 3 mensagens de uma vez public: - int sendMessage(unsigned char*); // Método que divide e envia uma mengam. - + int sendCD(unsigned char*); + int sendLS(unsigned char*); + int sendPUT(unsigned char*); + int sendGET(unsigned char*); + int sendData(unsigned char*); // Método que divide e envia uma mensagem. + // int receiveMessage(); // Método que recebe as mensagens e as agrupa }; diff --git a/src/messages.cpp b/src/messages.cpp index cc48a91..c0fd212 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -5,14 +5,74 @@ //######################### MÉTODOS DA CLASSE Message ######################### -int Message::sendMessage(unsigned char* stringMessage){ +int Message::sendCD(unsigned char* dirName){ + int error, success = 0, garbage, rv; + char *receiptMessage = (char*)malloc(sizeof(char*)*64); + struct pollfd ufds[1]; // usado para timeout em recv + SubMessage changeDir, answer; + + changeDir.setData(dirName,3,0); + + while(!success){ + error = send(soquete, changeDir.objToString(), changeDir.getSize()+4, 0); + if (error == -1){ + cout << "Erro ao tentar mudar de diretório (messages.cpp::sendCD)" << endl; + } + + garbage = 0; + while((garbage < 10) && (!success)){ + // recebe resposta + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + // vetor de pollfd, numero de buffers observados, timeout(ms) + rv = poll(ufds, 1, 500); + if(rv){ + if(rv == -1){ + cout << "Erro no recebimento de resposta (messages.cpp::sendData)" << endl; + return -1; + } else { + recv(soquete, receiptMessage, 68*sizeof(char), 0); + answer.stringToObj((unsigned char*)receiptMessage); + // Lê começo da mensagem e vê se tem o delimitador de início + if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 + success = 1; + if(answer.getType() == 8){ // 8 = OK + // Tá ok para mudar de Diretório + return 0; // YAY + } else if(answer.getType() == 0){ // 0 = NACK + // NACK + success = 0; // reenvia pedido + } else if(answer.getType() == 14){ //14 = 0xE --> Erro + // ERRO + if(answer.getData()[0] == '0'){ + cout << "Diretório Inexistente\n" << endl; + return -1; + } else if (answer.getData()[0] == '1'){ + cout << "Sem permissão para acessar o diretório\n" << endl; + return -1; + } else { + success = 0; // reenvia pedido + } + } + } + } + } else{ + cout << "Tempo limite de resposta excedido :c\n" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; + } + garbage++; + } + } +} + +int Message::sendData(unsigned char* stringMessage){ int numberOfMessages, sizeLastMessage, size=0; - int i, j, k, error, tipo, rv, success = 0; + int i, j, k, garbage, error, rv, success = 0; unsigned char* subData; // a parte da mensagem que vai em cada sequencia char *receiptMessage = (char*)malloc(sizeof(char*)*64); char *erro1, *erro2, *sucesso, *buffer; struct pollfd ufds[1]; // usado para timeout em recv - SubMessage answer; + SubMessage answer, end; // Calcula o tamanho da msg while( stringMessage[size] != '\0'){ @@ -26,26 +86,16 @@ int Message::sendMessage(unsigned char* stringMessage){ numberOfMessages = (size/64); } sizeLastMessage = size%64; + numberOfMessages++; // +1 = Mensagem de FIM // Cria as sub mensagens SubMessage subMensagem[numberOfMessages]; - // Atribui os tipos da mensagem - if(stringMessage[0] == 'l' && stringMessage[1] == 's'){ - tipo = 4; - } else if (stringMessage[0] == 'c' && stringMessage[1] == 'd'){ - tipo = 3; - } else if (stringMessage[0] == 'p' && stringMessage[1] == 'u' && stringMessage[2] == 't') { - tipo = 5; - } else if (stringMessage[0] == 'g' && stringMessage[1] == 'e' && stringMessage[10] == 't') { - tipo = 6; - } else { - tipo = 13; // 13 = 0xD --> Dados - } - // string usada para dividir a mensagem de entrada e colocar na parte de data das SubMessages subData = (unsigned char*) malloc(sizeof(unsigned char) * 64); + int tipo = 13; // 13 = 0xD --> Dados + // Divide a mensagem k = 0; // k é a numero da sequencia na submensagem for(i = 0; i < numberOfMessages-1; ++i){ @@ -65,20 +115,25 @@ int Message::sendMessage(unsigned char* stringMessage){ subData[j] = stringMessage[(i*64)+j]; } subMensagem[i].setData(subData, tipo, k); + ++k; }else{ // Caso contrario continua com o tamanho maior for(j = 0; j < 64; ++j){ subData[j] = stringMessage[(i*64)+j]; } subMensagem[i].setData(subData, tipo, k); + ++k; } + // Seta mensagem de FIM + i++; + subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", tipo = 0xF, sequencia = proxima // Caso haja só uma ou duas mensagens if (numberOfMessages < 4){ while(!success){ if(numberOfMessages < 1) { cout << "Algo parece estranho, sua mensagem contém conteúdo?\n" << endl; - cout << "Erro: Mensagem nula (messages.cpp::sendMessage)" << endl; + cout << "Erro: Mensagem nula (messages.cpp::sendData)" << endl; return -1; } // manda a primeira msg @@ -89,7 +144,7 @@ int Message::sendMessage(unsigned char* stringMessage){ error = send(soquete, subMensagem[2].objToString() , subMensagem[i].getSize()+4, 0); if(error == -1){ - cout << "Problema com o envio da mensagem (messages.cpp::sendMessage)" << endl; + cout << "Problema com o envio da mensagem (messages.cpp::sendData)" << endl; } // recebe resposta @@ -99,7 +154,7 @@ int Message::sendMessage(unsigned char* stringMessage){ rv = poll(ufds, 1, 500); if(rv){ if(rv == -1){ - cout << "Erro no recebimento de resposta (messages.cpp::sendMessage)" << endl; + cout << "Erro no recebimento de resposta (messages.cpp::sendData)" << endl; } else { recv(soquete, receiptMessage, 68*sizeof(char), 0); answer.stringToObj((unsigned char*)receiptMessage); @@ -109,26 +164,26 @@ int Message::sendMessage(unsigned char* stringMessage){ if(answer.getData()[0] == '1'){ success = 1; // YAY } else { - cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; + cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl; } } else if (numberOfMessages == 2){ // numero de mensagens = 2 if(answer.getData() == (unsigned char*)"1 1"){ // aceitou ambas as msgs success = 1; // YAY } else { - cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; + cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl; } } else { // numbero de mensagens = 3 if(answer.getData() == (unsigned char*)"1 2"){ // aceitou ambas as msgs success = 1; // YAY } else { - cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; + cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl; } } } } } else { cout << "Tempo limite de resposta excedido :c\n" << endl; - cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; } } success = 0; @@ -140,8 +195,8 @@ int Message::sendMessage(unsigned char* stringMessage){ error = send(soquete, subMensagem[i+2].objToString() , subMensagem[i].getSize()+4, 0); success = 0; - k = 0; - while((k < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo + garbage = 0; + while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo // recebe resposta ufds[0].fd = soquete; ufds[0].events = POLLIN; @@ -149,9 +204,10 @@ int Message::sendMessage(unsigned char* stringMessage){ rv = poll(ufds, 1, 500); if(rv){ if(rv == -1){ - cout << "Erro no recebimento de resposta (messages.cpp::sendMessage)" << endl; + cout << "Erro no recebimento de resposta (messages.cpp::sendData)" << endl; return -1; } else { + recv(soquete, receiptMessage, 68*sizeof(char), 0); answer.stringToObj((unsigned char*)receiptMessage); // Lê começo da mensagem e vê se tem o delimitador de início if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 @@ -174,9 +230,9 @@ int Message::sendMessage(unsigned char* stringMessage){ } } else { cout << "Tempo limite de resposta excedido :c\n" << endl; - cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; } - k++; + garbage++; } } } -- GitLab