From d508680a2a34a0128f5ffcc72162b9664cc1b731 Mon Sep 17 00:00:00 2001 From: Victor Perszel <vlp14@inf.ufpr.br> Date: Sun, 29 Nov 2015 23:42:14 -0200 Subject: [PATCH] sendLS e sendPUT completos --- include/connectionRawSocket.h | 2 + src/messages.cpp | 113 +++++++++++++++++++++++++++++++--- src/submessages.cpp | 4 +- 3 files changed, 109 insertions(+), 10 deletions(-) diff --git a/include/connectionRawSocket.h b/include/connectionRawSocket.h index 91ba9b0..8db0796 100644 --- a/include/connectionRawSocket.h +++ b/include/connectionRawSocket.h @@ -20,6 +20,8 @@ #include <cstdlib> #include <poll.h> #include <bitset> +#include <fstream> +#include <map> using namespace std; diff --git a/src/messages.cpp b/src/messages.cpp index 083ed2b..65a35c4 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -69,7 +69,7 @@ int Message::sendLS(unsigned char* options){ int error, success = 0, garbage, rv; char *receiptMessage = (char*)malloc(sizeof(char*)*64); struct pollfd ufds[1]; // usado para timeout em recv - String listagem; + char* listagem; SubMessage listDir, answer, ack, nack; ufds[0].fd = soquete; @@ -100,11 +100,11 @@ int Message::sendLS(unsigned char* options){ if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra // Mostra as mensagens if(answer.checkParity()){ // Caso a paridade dê errado - nack.setData(answer.getSeq(),0,0); // Manda um nack + nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack send(soquete,nack.objToString(),nack.getSize()+4, 0); success = 0; } else { - strcat(listagem,answer.getData()); // Põe o valor recebido em "listagem" + strcat(listagem,(char*)answer.getData()); // Põe o valor recebido em "listagem" success = 0; while(!success){ rv = poll(ufds, 1, 500); // Observa por novas mensagens @@ -113,19 +113,26 @@ int Message::sendLS(unsigned char* options){ answer.stringToObj((unsigned char*)receiptMessage); if(answer.getStartMessage() == 0x7E){ if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra - strcat(listagem,answer.getData()); // Põe em "listagem" - ack.setData(answer.getSeq(),1,0); - send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + if(answer.checkParity()){ // Caso a paridade dê errado + nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + send(soquete,nack.objToString(),nack.getSize()+4, 0); + success = 0; + } else { + strcat(listagem,(char*)answer.getData()); // Põe em "listagem" + ack.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + } } else if (answer.getType() == 15) { // Se for FIM - ack.setData(answer.getSeq(),1,0); + ack.setData((unsigned char*)answer.getSeq(),1,0); success = 1; } } } else { - // TIMEOUT + cout << "TIMEOUT DO LS (messages.cpp::sendLS)" << endl; } } } + cout << listagem << endl; return 0; // YAY } else if(answer.getType() == 0){ // 0 = NACK // NACK @@ -150,6 +157,96 @@ int Message::sendLS(unsigned char* options){ } } +int Message::sendPUT(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 put, answer, size; + ifstream fileIn; + + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + + put.setData(fileName,5,0); + + fileIn.open((char*)fileName, ios::in); + fileIn.seekg(0); + + while(getline(fileIn, temp)) { + fileData += temp + "\n"; + } + + while(!success){ + error = send(soquete, put.objToString(), put.getSize()+4, 0); + if (error == -1){ + cout << "Erro ao enviar arquivo (messages.cpp::sendPUT)" << 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::sendPUT)" << 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 + // OK, mandar tamanho + size.setData((unsigned char*)fileData.size(),9,0); + send(soquete, size.objToString(), size.getSize()+4, 0); + success = 0; + while(!success){ + rv = poll(ufds, 1, 500); + if (rv){ + if(rv == -1){ + cout << "Erro no recebimento de resposta (messages.cpp::sendPUT)" << endl; + return -1; + } else { + recv(soquete, receiptMessage, 68*sizeof(char), 0); + answer.stringToObj((unsigned char*)receiptMessage); + if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 + if(answer.getType() == 8){ + success = 1; + if(sendData((unsigned char*)fileData.c_str())){ + cout << "Erro ao mandar dados (messages.cpp::sendPUT)" << endl; + return -1; + } + } else if (answer.getType() == 0){ + success = 0; + } else if (answer.getType() == 15){ // 15 = 0xE --> Erro + if(answer.getData()[0] == '2'){ + cout << "Não tem espaço para mandar o arquivo" << endl; + return -1; + } else { + success = 0; + } + } + } + } + } + } + } else if(answer.getType() == 0){ // 0 = NACK + // NACK + success = 0; // reenvia pedido + } + } + } + } else{ + cout << "Tempo limite de resposta excedido :c\n" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::sendPUT)" << endl; + } + garbage++; + } + } +} + int Message::sendData(unsigned char* stringMessage){ int numberOfMessages, sizeLastMessage, size=0; int i, j, k, garbage, error, rv, success = 0; diff --git a/src/submessages.cpp b/src/submessages.cpp index 6489dcc..9c32a24 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -162,8 +162,8 @@ int SubMessage::checkParity(){ } if (parityTest == parity){ - return 1; - }else{ return 0; + }else{ + return 1; } } -- GitLab