From 342a9bfe9ac8a32ed6a7f8b9a8852db864b8692b Mon Sep 17 00:00:00 2001 From: Victor Perszel <vlp14@inf.ufpr.br> Date: Mon, 30 Nov 2015 02:48:33 -0200 Subject: [PATCH] prototipo sendGET --- src/messages.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/messages.cpp b/src/messages.cpp index 65a35c4..974a716 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -247,6 +247,77 @@ int Message::sendPUT(unsigned char* fileName){ } } +int Message::sendGET(unsigned char* fileName){ + int error, success = 0, garbage, rv; + char *receiptMessage = (char*)malloc(sizeof(char*)*64); + string temp, fileData; + struct pollfd ufds[1]; // usado para timeout em recv + SubMessage get, answer, ack, nack, err, ok; + ofstream fileOut; + + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + + get.setData(fileName,6,0); + + while(!success){ + error = send(soquete, get.objToString(), get.getSize()+4, 0); + if (error == -1){ + cout << "Erro ao receber arquivo (messages.cpp::sendGET)" << endl; + } + + garbage = 0; + while((garbage < 10) && (!success)){ + // 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::sendGET)" << 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 + if(answer.getType() == 0){ + success = 0; + } else if (answer.getType() == 15){ // Erro + if(answer.getData()[0] == '0'){ + cout << "Arquivo Inexistente" << endl; + ack.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + return -1; + } else if (answer.getData()[0] == '1'){ + cout << "Sem permissão para baixar o arquivo" << endl; + ack.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + return -1; + } else { + success = 0; + } + } else if (answer.getType() == 9){ // Tamanho + if(testaSeTamanhoEhInvalido()){ + err.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, err.objToString(), err.getSize()+4, 0); // Erro + return -1; + } else if(answer.checkParity()){ + nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + send(soquete,nack.objToString(),nack.getSize()+4, 0); + return -1; + } else { + ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok + send(soquete,ok.objToString(),ok.getSize()+4, 0); + funcaoRecebeDados(); + return 0; + } + } + } + } + } + } + } +} + int Message::sendData(unsigned char* stringMessage){ int numberOfMessages, sizeLastMessage, size=0; int i, j, k, garbage, error, rv, success = 0; -- GitLab