diff --git a/include/messages.h b/include/messages.h index 676d450e50800c73e0a9611d6a683eb7f9dd22e4..79167c51adffcc171654067a85982002c15cbea4 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 int receiveData(unsigned char*, int, int); // Método que recebe as mensagens e as agrupa - + static string receiveData(unsigned char*, 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 ea2d9ff5d93e304f1873a08e75ecdeee63a2309d..af11304578cff1224606fa9d453a0902d42205e4 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 = NULL; // Área para envio dos dados. + unsigned char *data = (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/messages.cpp b/src/messages.cpp index bc20e5b4f1b833b635584d540edd722fb396bfd1..029fe82d0b61cfbb96a5daa4154378822bf3943f 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -120,7 +120,7 @@ int Message::sendLS(unsigned char* options){ send(soquete,nack.objToString(),68, 0); success = 0; } else { - if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData()), 0) == 0){ + if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData())) != ""){ success = 1; }else{ success = 0; @@ -316,7 +316,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()),1) == -1){ + if(receiveData(fileName,atoi((char*)answer.getData())) == ""){ cout << "Erro no recebimento de dados (messages.cpp::sendGET)" << endl; return -1; } else { @@ -398,53 +398,33 @@ int Message::sendData(unsigned char* stringMessage){ 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::sendData)" << endl; - return -1; - } - // manda a primeira msg - error = send(soquete, subMensagem[0].objToString() , subMensagem[i].getSize()+4, 0); - if(numberOfMessages > 1) // Se forem 2 ou 3 msgs, manda a segunda - error = send(soquete, subMensagem[1].objToString() , subMensagem[i].getSize()+4, 0); - if(numberOfMessages > 2) // Se forem 3 msgs, manda a terceira - error = send(soquete, subMensagem[2].objToString() , subMensagem[i].getSize()+4, 0); - - if(error == -1){ - cout << "Problema com o envio da mensagem (messages.cpp::sendData)" << endl; - } - + i = 0; + while (i < numberOfMessages){ + success = 0; + garbage = 0; + error = send(soquete, subMensagem[i].objToString() , 68, 0); + if(error == -1){ + cout << "Problemas com o envio da mensagem! (messages.cpp: sendData)" << endl; + success = 1; + } + while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo // 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::sendData)" << endl; + return -1; } else { recv(soquete, receiptMessage, 68, 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 - if(numberOfMessages == 1){ - if(answer.getType() == 1){ //ACK - success = 1; // YAY - } else { - cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl; - } - } else if (numberOfMessages == 2){ // numero de mensagens = 2 - if((answer.getType() == 1) && (answer.getData() == (unsigned char*)'1') ){ // aceitou ambas as msgs - success = 1; // YAY - } else { - cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl; - } - } else { // numbero de mensagens = 3 - if((answer.getType() == 1) && (answer.getData() == (unsigned char*)'2') ){ // aceitou ambas as msgs - success = 1; // YAY - } else { - cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl; - } + if(answer.getType() == 1) { + success = 1; + i++; + }else{ + success = 0; } } } @@ -453,56 +433,6 @@ int Message::sendData(unsigned char* stringMessage){ cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; } } - success = 0; - } else if (numberOfMessages > 3){ - i = 0; - while (i < numberOfMessages - 2){ - error = send(soquete, subMensagem[i].objToString() , subMensagem[i].getSize()+4, 0); - if(i < numberOfMessages - 1) - error = send(soquete, subMensagem[i+1].objToString() , subMensagem[i].getSize()+4, 0); - if(i < numberOfMessages) - error = send(soquete, subMensagem[i+2].objToString() , subMensagem[i].getSize()+4, 0); - - success = 0; - garbage = 0; - while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo - // 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, 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() == 1) { - sprintf(erro1, "%d", i); - sprintf(erro2, "%d", i+1); - sprintf(sucesso, "%d", i+2); - if(answer.getData() == (unsigned char*)erro1){ - i += 1; - } else if (answer.getData() == (unsigned char*)erro2){ - i += 2; - } else if (answer.getData() == (unsigned char*)sucesso){ - i += 3; - } else { - success = 0; - } - } else if (answer.getType() == 0){ - success = 0; // NACK - } - } - } - } else { - cout << "Tempo limite de resposta excedido :c\n" << endl; - cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; - } - garbage++; - } - } } return 0; } @@ -728,7 +658,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,1) == 0){ + if(receiveData(fileName,size) == ""){ cout << "Dados recebidos com sucesso!" << endl; return 0; } else { @@ -747,15 +677,13 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ } } -int Message::receiveData(unsigned char* fileName, int size, int save){ - int numberOfMessages, messagesCounter = 0, seqCounter; - int i, garbage, error, rv, success = 0, greaterSeq = 0; - unsigned char *subData; +string Message::receiveData(unsigned char* fileName, int size){ + int numberOfMessages, messagesCounter = 0, seqCounter = 0; + int i, garbage, error, rv, success = 0; char *receiptMessage = (char*)malloc(sizeof(char*)*68); struct pollfd ufds[1]; SubMessage nack, ack, answer; - ofstream fileOut; - map<int,string> subMensagem; + map<int,string> subData; string finalMessage; ufds[0].fd = soquete; @@ -774,46 +702,28 @@ while(!success){ if(rv){ if(rv == -1){ cout << "Erro no recebimento dos dados (messages.cpp::receiveData)" << endl; - return -1; + return(""); }else{ recv(soquete, receiptMessage, 68, 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 if(answer.checkParity()){ - if(messagesCounter == 0){ // Se a primeira mensagem tiver erro - nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack - send(soquete,nack.objToString(),nack.getSize()+4, 0); - }else{ - ack.setData((unsigned char*)((answer.getSeq()-1)%64),1,0); - send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK - messagesCounter = 0; - } + nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + send(soquete,nack.objToString(),68, 0); }else{ if(answer.getType() == 13){ - if(subMensagem[answer.getSeq()+(seqCounter*64)] == ""){ - if(answer.getSeq() == 63){ - seqCounter++; - } - subMensagem[answer.getSeq()+(seqCounter*64)] = (char*)answer.getData(); - messagesCounter++; - if(answer.getSeq()+(seqCounter*64) > greaterSeq){ - greaterSeq = answer.getSeq()+(seqCounter*64); - } - if(messagesCounter > 2){ - ack.setData((unsigned char*)(greaterSeq%64),1,0); - send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK - messagesCounter = 0; - } - }else{ - ack.setData((unsigned char*)answer.getSeq(),1,0); - send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK - messagesCounter = 0; - } + subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData(); + 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*)((greaterSeq%64)+1),1,0); - send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + ack.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, ack.objToString(), 68, 0); // Manda um ACK + }else{ + nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + send(soquete,nack.objToString(),68, 0); } } } @@ -824,17 +734,9 @@ while(!success){ } } - for(i = 0; i < greaterSeq; ++i){ - finalMessage += subMensagem[i]; - } - - if(save){ - // Escrita no arquivo de saída. - fileOut.open((char *)fileName, ios::out); - fileOut << finalMessage; - } else { - cout << finalMessage << endl; + for(i = 0; i < numberOfMessages; ++i){ + finalMessage += subData[i]; } - return 0; + return finalMessage; } diff --git a/src/submessages.cpp b/src/submessages.cpp index 7289c31af362a7c3202fa6de316ac6ccb9386f3a..10da4292af0ed4848ce92139a627016a374c980b 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -54,10 +54,8 @@ void SubMessage::setData(unsigned char* dataBody, int type, int seq){ int i, tamanho = 1; while(dataBody[tamanho-1] != '\0' && tamanho<64) tamanho++; - cout << "AQUI" << endl; - delete(data); - cout << "FERA" << endl; - data = new unsigned char[tamanho]; + + data = (unsigned char*)realloc(data, sizeof(unsigned char)*tamanho); for (i = 0; i < tamanho; i++){ data[i] = dataBody[i];