diff --git a/include/messages.h b/include/messages.h index 79167c51adffcc171654067a85982002c15cbea4..ebb324a3fe8000a6fd633553511e78f3122eebb6 100644 --- a/include/messages.h +++ b/include/messages.h @@ -22,7 +22,7 @@ class Message{ static int receiveLS(unsigned char*, char*); // Lida com mensagens tipo LS static int receivePUT(unsigned char*, char*); // Lida com... ok você entendeu static int receiveGET(unsigned char*); - static string receiveData(unsigned char*, int); // Método que recebe as mensagens e as agrupa + static string receiveData(int); // Método que recebe as mensagens e as agrupa static int lsParameter(string); // Usado para decidir qual tipo de ls será feito. }; diff --git a/include/submessages.h b/include/submessages.h index af11304578cff1224606fa9d453a0902d42205e4..9ba2d2e69a64bd2b1a42c18eb01b69b94f9a04cd 100644 --- a/include/submessages.h +++ b/include/submessages.h @@ -9,7 +9,7 @@ class SubMessage{ private: unsigned char startMessage; // Delimitador de início. int sizSeqTyp; // 6 bits para tamanho, 6 bits para sequencia e 4 bits para o tipo. - unsigned char *data = (unsigned char*)""; // Área para envio dos dados. + unsigned char *data = (unsigned char*)malloc(sizeof(unsigned char)); // Área para envio dos dados. unsigned char parity; // 1 Byte para a paridade vertical (detecção de erros). // Calcula a paridade da mensagem, esse método está como privado para ser diff --git a/src/main.cpp b/src/main.cpp index 1cf10fd1886465f11911f812ddb3103c359171ee..0774bc40d82023f1cd4933b8c58499ed3d1d7ab8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -88,6 +88,8 @@ int main(int argc, char *argv[]) { resposta.setData((unsigned char*)"4",0,0); // Manda um Nack send(soquete,resposta.objToString(),68, 0); } else { + resposta.setData((unsigned char*)"4",1,0); // Manda um ack + send(soquete,resposta.objToString(),68, 0); cout << "res " << serverReceive.getData() << endl; if(mainMessage.receiveLS(serverReceive.getData(), currentPath)){ cout << "ERRO: ls remoto."; diff --git a/src/messages.cpp b/src/messages.cpp index 029fe82d0b61cfbb96a5daa4154378822bf3943f..a9a46569420e4e174563449124b8430b00d8810c 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -66,27 +66,29 @@ int Message::sendCD(unsigned char* dirName){ } int Message::sendLS(unsigned char* options){ - int error, success = 0, garbage, rv; + int error, success, garbage, rv; char *receiptMessage = (char*)malloc(sizeof(char*)*68); struct pollfd ufds[1]; // usado para timeout em recv - char *listagem, sequence[3]; SubMessage listDir, answer, ack, nack; + string showLS; ufds[0].fd = soquete; ufds[0].events = POLLIN; - +cout << "lsr ----> 1 " << endl; listDir.setData(options,4,0); - +cout << "lsr ----> 1 " << endl; while(!success){ error = send(soquete, listDir.objToString(), 68, 0); if (error == -1){ cout << "Erro ao tentar listar diretorio (messages.cpp::sendLS)" << endl; } - +cout << "lsr ----> 1 " << endl; garbage = 0; + success = 0; while((garbage < 10) && (!success)){ // vetor de pollfd, numero de buffers observados, timeout(ms) rv = poll(ufds, 1, 500); + garbage++; if(rv){ if(rv == -1){ cout << "Erro no recebimento de resposta (messages.cpp::sendLS)" << endl; @@ -97,55 +99,26 @@ int Message::sendLS(unsigned char* options){ if(receiptMessage[0] == 0x7E){ // 0x7E = 01111110 answer.stringToObj((unsigned char*)receiptMessage); success = 1; - if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra - // Mostra as mensagens - if(answer.checkParity()){ // Caso a paridade dê errado - sprintf(sequence, "%d", answer.getSeq()); - nack.setData((unsigned char*)sequence,0,0); // Manda um nack - send(soquete,nack.objToString(),68, 0); - success = 0; - } else { - strcat(listagem,(char*)answer.getData()); // Põe o valor recebido em "listagem" + if(answer.checkParity()){ // Caso a paridade dê errado + success = 0; // Vai reenviar + }else{ + if(answer.getType() == 1){ + showLS = receiveData(10); + if(showLS != ""){ + success = 1; + }else{ + success = 0; + } + }else if(answer.getType() == 0){ success = 0; - while(!success){ - rv = poll(ufds, 1, 500); // Observa por novas mensagens - if(rv){ - recv(soquete, receiptMessage, 68, 0); - if(receiptMessage[0] == 0x7E){ - answer.stringToObj((unsigned char*)receiptMessage); - if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra - if(answer.checkParity()){ // Caso a paridade dê errado - sprintf(sequence, "%d", answer.getSeq()); - nack.setData((unsigned char*)sequence,0,0); // Manda um nack - send(soquete,nack.objToString(),68, 0); - success = 0; - } else { - if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData())) != ""){ - success = 1; - }else{ - success = 0; - } - } - } - } - } else { - cout << "TIMEOUT DO LS (messages.cpp::sendLS)" << endl; - } + }else if(answer.getType() == 14){ + if(answer.getData()[0] == '0'){ + cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl; + return -1; + } else { + success = 0; // reenvia pedido } } - cout << listagem << endl; - 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 << "Opção inválida, por favor tente -l, -a ou -la\n" << endl; - return -1; - } else { - success = 0; // reenvia pedido - } } } } @@ -153,7 +126,6 @@ int Message::sendLS(unsigned char* options){ cout << "Tempo limite de resposta excedido :c\n" << endl; cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; } - garbage++; } } } @@ -316,7 +288,7 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){ } else { ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok send(soquete,ok.objToString(),ok.getSize()+4, 0); - if(receiveData(fileName,atoi((char*)answer.getData())) == ""){ + if(receiveData(13) == ""){ cout << "Erro no recebimento de dados (messages.cpp::sendGET)" << endl; return -1; } else { @@ -658,7 +630,7 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ resposta.setData((unsigned char*)'0',8,0); // Manda um OK send(soquete,resposta.objToString(),resposta.getSize()+4, 0); // Fica esperando dados - if(receiveData(fileName,size) == ""){ + if(receiveData(13) == ""){ cout << "Dados recebidos com sucesso!" << endl; return 0; } else { @@ -677,9 +649,9 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ } } -string Message::receiveData(unsigned char* fileName, int size){ +string Message::receiveData(int type){ int numberOfMessages, messagesCounter = 0, seqCounter = 0; - int i, garbage, error, rv, success = 0; + int i, garbage, error, rv, success = 0, size = 0; char *receiptMessage = (char*)malloc(sizeof(char*)*68); struct pollfd ufds[1]; SubMessage nack, ack, answer; @@ -689,15 +661,8 @@ string Message::receiveData(unsigned char* fileName, int size){ ufds[0].fd = soquete; ufds[0].events = POLLIN; - // Verifica quantas mensagens serao necessarias - if (size%64){ - numberOfMessages = (size/64) + 1; - }else{ - numberOfMessages = (size/64); - } - numberOfMessages++; // +1 = Mensagem de FIM -while(!success){ + while(!success){ rv = poll(ufds, 1, 500); if(rv){ if(rv == -1){ @@ -712,11 +677,14 @@ while(!success){ nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack send(soquete,nack.objToString(),68, 0); }else{ - if(answer.getType() == 13){ - subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData(); + if(answer.getType() == type){ + if(subData[(seqCounter*64)+answer.getSeq()] == ""){ + subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData(); + if(answer.getSeq() == 63) seqCounter++; + size++; + } ack.setData((unsigned char*)answer.getSeq(),1,0); send(soquete, ack.objToString(), 68, 0); // Manda um ACK - if(answer.getSeq() == 63) seqCounter++; }else if(answer.getType() == 15){ success = 1; ack.setData((unsigned char*)answer.getSeq(),1,0); @@ -734,7 +702,7 @@ while(!success){ } } - for(i = 0; i < numberOfMessages; ++i){ + for(i = 0; i < size; ++i){ finalMessage += subData[i]; }