From fdc69e29807be742bcc4dc2d44e81bfee56893a5 Mon Sep 17 00:00:00 2001 From: Eduardo Machado <emm14@inf.ufpr.br> Date: Sun, 6 Dec 2015 17:15:40 -0200 Subject: [PATCH] lsr aparentemente funcionando C: --- include/messages.h | 2 +- src/main.cpp | 4 +++- src/messages.cpp | 57 ++++++++++++++------------------------------- src/submessages.cpp | 3 +-- 4 files changed, 23 insertions(+), 43 deletions(-) diff --git a/include/messages.h b/include/messages.h index ebb324a..f7b7ed8 100644 --- a/include/messages.h +++ b/include/messages.h @@ -15,7 +15,7 @@ class Message{ static int sendLS(unsigned char*); static int sendPUT(unsigned char*); static int sendGET(unsigned char*, char*); - static int sendData(unsigned char*); // Método que divide e envia uma mensagem. + static int sendData(unsigned char*, int); // Método que divide e envia uma mensagem. // Métodos que faz o recebimento e resposta aos comandos static int receiveCD(unsigned char*); // Lida com mensagens tipo CD diff --git a/src/main.cpp b/src/main.cpp index 0774bc4..173bc84 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,6 +55,7 @@ int main(int argc, char *argv[]) { cin >> parameter; mainMessage.sendCD((unsigned char*)(parameter.c_str())); }else if(command == "lsr"){ + cin >> parameter; mainMessage.sendLS((unsigned char*)(parameter.c_str())); } } @@ -62,6 +63,8 @@ int main(int argc, char *argv[]) { cout << "Execução em modo servidor iniciada." << endl; cout << "===================================" << endl; while(1){ + if ((buff = (char *)malloc((size_t)size)) != NULL) + currentPath = getcwd(buff, (size_t)size); receiptSize = recv(soquete, receiptMessage, 16, 0); if (receiptSize != -1) { // Lê começo da mensagem e vê se tem o delimitador de início @@ -90,7 +93,6 @@ int main(int argc, char *argv[]) { } 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 a9a4656..2b9614a 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -66,7 +66,7 @@ int Message::sendCD(unsigned char* dirName){ } int Message::sendLS(unsigned char* options){ - int error, success, garbage, rv; + int error, success = 0, garbage, rv; char *receiptMessage = (char*)malloc(sizeof(char*)*68); struct pollfd ufds[1]; // usado para timeout em recv SubMessage listDir, answer, ack, nack; @@ -74,15 +74,12 @@ int Message::sendLS(unsigned char* options){ 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)){ @@ -106,6 +103,7 @@ cout << "lsr ----> 1 " << endl; showLS = receiveData(10); if(showLS != ""){ success = 1; + cout << showLS << endl; }else{ success = 0; } @@ -187,7 +185,7 @@ int Message::sendPUT(unsigned char* fileName){ if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 if(answer.getType() == 8){ success = 1; - if(sendData((unsigned char*)fileData.c_str())){ + if(sendData((unsigned char*)fileData.c_str(), 13)){ cout << "Erro ao mandar dados (messages.cpp::sendPUT)" << endl; return -1; } @@ -304,7 +302,7 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){ } } -int Message::sendData(unsigned char* stringMessage){ +int Message::sendData(unsigned char* stringMessage, int type){ int numberOfMessages, sizeLastMessage, size=0; int i, j, k, garbage, error, rv, success = 0; unsigned char* subData; // a parte da mensagem que vai em cada sequencia @@ -328,7 +326,7 @@ int Message::sendData(unsigned char* stringMessage){ numberOfMessages = (size/64); } sizeLastMessage = size%64; - numberOfMessages++; // +1 = Mensagem de FIM + numberOfMessages += 2; // +1 = Mensagem de FIM // Cria as sub mensagens SubMessage subMensagem[numberOfMessages]; @@ -336,15 +334,13 @@ int Message::sendData(unsigned char* stringMessage){ // 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){ + for(i = 0; i < numberOfMessages-2; ++i){ for(j = 0; j < 64; ++j){ subData[j] = stringMessage[(i*64)+j]; } - subMensagem[i].setData(subData, tipo, k); + subMensagem[i].setData(subData, type, k); ++k; if(k == 64){ // Caso estoure o número de bits de sequencia k = 0; @@ -356,19 +352,19 @@ int Message::sendData(unsigned char* stringMessage){ for(j = 0; j < sizeLastMessage; ++j){ subData[j] = stringMessage[(i*64)+j]; } - subMensagem[i].setData(subData, tipo, k); + subMensagem[i].setData(subData, type, 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); + subMensagem[i].setData(subData, type, k); ++k; } // Seta mensagem de FIM i++; - subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", tipo = 0xF, sequencia = proxima + subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", type = 0xF, sequencia = proxima i = 0; while (i < numberOfMessages){ @@ -446,41 +442,26 @@ int Message::receiveLS(unsigned char* options, char* currentPath){ ifstream lsFile; unsigned char* lsData; int i; -cout << "-1-" << endl; parameter = (char*)options; -cout << "-parameter- " << parameter << endl; path = currentPath; -cout << "-3-" << endl; /* Para dar um ls apenas, é necessário escrever "ls ." */ /* Precisamos pensar em um jeito de concertar isso. */ switch(lsParameter(parameter)){ case 1: -cout << "-case1-" << endl; lsAux = "ls > " + path + "/ls.txt"; -cout << "-case1.1-" << endl; system(lsAux.c_str()); -cout << "-case1.2-" << endl; break; case 2: -cout << "-case2-" << endl; lsAux = "ls -a > " + path + "/ls.txt"; -cout << "-case2.1-" << endl; system(lsAux.c_str()); -cout << "-case2.2-" << endl; break; case 3: -cout << "-case3-" << endl; lsAux = "ls -l > " + path + "/ls.txt"; -cout << "-case3.1-" << endl; system(lsAux.c_str()); -cout << "-case3.2-" << endl; break; case 4: -cout << "-case4-" << endl; lsAux = "ls -la > " + path + "/ls.txt"; -cout << "-case4.1-" << endl; system(lsAux.c_str()); -cout << "-case4.2-" << endl; break; case -1: puts("Parâmetro de ls inválido."); @@ -509,7 +490,7 @@ cout << "+2+" << endl; } cout << "+3+" << endl; - if(sendData(lsData) == 0){ + if(sendData(lsData, 14) == 0){ cout << "+return 0+" << endl; return 0; }else{ @@ -569,7 +550,7 @@ int Message::receiveGET(unsigned char* fileName){ return -1; } else if(answer.getType() == 8){ // Recebemos um OK, enviar dados success = 1; - if(sendData(dados)){ + if(sendData(dados, 13)){ cout << "Erro ao enviar dados, abortando (messages.cpp::receiveGET)" << endl; return -1; } else { @@ -651,7 +632,7 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){ string Message::receiveData(int type){ int numberOfMessages, messagesCounter = 0, seqCounter = 0; - int i, garbage, error, rv, success = 0, size = 0; + int i, garbage, error, rv, success, size = 0; char *receiptMessage = (char*)malloc(sizeof(char*)*68); struct pollfd ufds[1]; SubMessage nack, ack, answer; @@ -660,8 +641,7 @@ string Message::receiveData(int type){ ufds[0].fd = soquete; ufds[0].events = POLLIN; - - + success = 0; while(!success){ rv = poll(ufds, 1, 500); if(rv){ @@ -674,7 +654,7 @@ string Message::receiveData(int type){ // Lê começo da mensagem e vê se tem o delimitador de início if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 if(answer.checkParity()){ - nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + nack.setData((unsigned char*)"0",0,0); // Manda um nack send(soquete,nack.objToString(),68, 0); }else{ if(answer.getType() == type){ @@ -683,21 +663,20 @@ string Message::receiveData(int type){ if(answer.getSeq() == 63) seqCounter++; size++; } - ack.setData((unsigned char*)answer.getSeq(),1,0); + ack.setData((unsigned char*)"0",1,0); send(soquete, ack.objToString(), 68, 0); // Manda um ACK }else if(answer.getType() == 15){ success = 1; - ack.setData((unsigned char*)answer.getSeq(),1,0); + ack.setData((unsigned char*)"0",1,0); send(soquete, ack.objToString(), 68, 0); // Manda um ACK }else{ - nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + nack.setData((unsigned char*)"0",0,0); // Manda um nack send(soquete,nack.objToString(),68, 0); } } } } }else{ - cout << "Tempo limite de resposta excedido :c\n" << endl; cout << "TIMEOUT ATINGIDO (messages.cpp::receiveData)" << endl; } } diff --git a/src/submessages.cpp b/src/submessages.cpp index 10da429..841cf88 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -53,7 +53,7 @@ void SubMessage::setSizSeqTyp(int size, int seq, int type){ void SubMessage::setData(unsigned char* dataBody, int type, int seq){ int i, tamanho = 1; - while(dataBody[tamanho-1] != '\0' && tamanho<64) tamanho++; + while(dataBody[tamanho-1] != '\0' && tamanho<63) tamanho++; data = (unsigned char*)realloc(data, sizeof(unsigned char)*tamanho); @@ -158,7 +158,6 @@ int SubMessage::checkParity(){ // Atribui os bits para parity (variável de paridade do objeto) parityTest = (parityTest << 1) | bitsParity[j]; } - if (parityTest == parity){ return 0; }else{ -- GitLab