diff --git a/arc b/arc new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/messages.cpp b/src/messages.cpp index e18cd9449660dd34f159d6f83fb0c97144eb2076..6d2b3b876fc7390f402ff6e68084fbd942d94d0a 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -335,6 +335,9 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){ } } } + }else{ + cout << "Tempo limite de resposta excedido :c\n" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::sendPUT)" << endl; } } } @@ -537,9 +540,9 @@ int Message::receiveLS(unsigned char* options, char* currentPath){ int Message::receiveGET(unsigned char* fileName){ char* tam; - unsigned char* dados; - int fileSize, rv, i, success = 0; - ifstream file; + unsigned char *dados, *fileData; + int fileSize, rv, i, success = 0, length; + ifstream fileIn; string temp, data; SubMessage resposta, answer; struct pollfd ufds[1]; @@ -554,58 +557,73 @@ int Message::receiveGET(unsigned char* fileName){ send(soquete,resposta.objToString(),68, 0); } else { // Calcula o tamanho do arquivo - file.seekg (0, ios::end); - fileSize = file.tellg(); - file.seekg (0, ios::beg); - - while(getline(file, temp)) { - data += temp + "\n"; - } - dados=(unsigned char*)malloc(sizeof(unsigned char)*data.size()); - for(i = 0; i < data.size(); ++i){ - dados[i] = data[i]; + // file.seekg (0, ios::end); + // fileSize = file.tellg(); + // file.seekg (0, ios::beg); + // + // while(getline(file, temp)) { + // data += temp + "\n"; + // } + // dados=(unsigned char*)malloc(sizeof(unsigned char)*data.size()); + // for(i = 0; i < data.size(); ++i){ + // dados[i] = data[i]; + // } + + fileIn.open((char*)fileName, ios::binary); + + // Contagem do tamanho do arquivo. + fileIn.seekg (0, ios::end); + length = fileIn.tellg(); + fileIn.seekg (0, ios::beg); + + // Alocação do vetor para a leitura do arquivo. + fileData = new unsigned char[length]; + + // Leitura. + for (i = 0; i < length; ++i){ + fileIn.read((char*)&fileData[i], sizeof(unsigned char)); } // Manda o tamanho do arquivo - sprintf(tam, "%d", fileSize); - while(!success){ // Esse while está aqui pois a mensagem pode não chegar e precisar ser reenviada - resposta.setData((unsigned char*)tam,9,0); - send(soquete, resposta.objToString(), resposta.getSize()+4, 0); - // Espera resposta - rv = poll(ufds, 1, 500); - if(rv){ - if(rv == -1){ - cout << "Erro no recebimento dos dados (messages.cpp::receiveGET)" << endl; - return -1; - } else { - // Lê começo da mensagem e vê se tem o delimitador de início - if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 - if(answer.getType() == 14){ // Recebemos um erro - // Tamanho é muito pequeno - cout << "Tamanho de arquivo muito grande, pare (messages.cpp::receiveGET)" << endl; + sprintf(tam, "%d", length); + while(!success){ // Esse while está aqui pois a mensagem pode não chegar e precisar ser reenviada + resposta.setData((unsigned char*)tam,9,0); + send(soquete, resposta.objToString(), resposta.getSize()+4, 0); + // Espera resposta + rv = poll(ufds, 1, 500); + if(rv){ + if(rv == -1){ + cout << "Erro no recebimento dos dados (messages.cpp::receiveGET)" << endl; + return -1; + } else { + // Lê começo da mensagem e vê se tem o delimitador de início + if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 + if(answer.getType() == 14){ // Recebemos um erro + // Tamanho é muito pequeno + cout << "Tamanho de arquivo muito grande, pare (messages.cpp::receiveGET)" << endl; + return -1; + } else if(answer.getType() == 8){ // Recebemos um OK, enviar dados + success = 1; + if(sendData(dados, 13)){ + cout << "Erro ao enviar dados, abortando (messages.cpp::receiveGET)" << endl; return -1; - } else if(answer.getType() == 8){ // Recebemos um OK, enviar dados - success = 1; - if(sendData(dados, 13)){ - cout << "Erro ao enviar dados, abortando (messages.cpp::receiveGET)" << endl; - return -1; - } else { - cout << "Dados enviados com sucesso" << endl; - return 0; - } - } else { // Provavelmente recebemos um NACK, de qualquer jeito, enviamos de novo - success = 0; + } else { + cout << "Dados enviados com sucesso" << endl; + return 0; } + } else { // Provavelmente recebemos um NACK, de qualquer jeito, enviamos de novo + success = 0; } } - } else { - // TIMEOUT - cout << "Tempo limite de resposta excedido :c\n" << endl; - cout << "TIMEOUT ATINGIDO (messages.cpp::receiveGET)" << endl; - return -1; } + } else { + // TIMEOUT + cout << "Tempo limite de resposta excedido :c\n" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::receiveGET)" << endl; + return -1; } } + } } int Message::receivePUT(unsigned char* fileName, char* currentPath){ diff --git a/src/submessages.cpp b/src/submessages.cpp index e791a094c2de5db94122a33e8afea55b8648941b..b25c5255c8ced29f7fb4efdec2533e6f1d05504b 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -13,8 +13,14 @@ void SubMessage::setParity(){ int i, j, bitsParity[8]; // Alocação da matriz de bits - bitsMessage = new int*[getSize()]; - for(i = 0 ; i < getSize() ; i++){ + bitsMessage = new int*[getSize()+2]; + bitsMessage[0] = new int[8]; + bitsMessage[1] = new int[8]; + for(j = 0 ; j < 8 ; j++){ + bitsMessage[0][j] = ((((sizSeqTyp >> 8) & 0x00FF) >> (7-j)) & 0x01); + bitsMessage[1][j] = ((((sizSeqTyp >> 0) & 0x00FF) >> (7-j)) & 0x01); + } + for(i = 2 ; i < getSize()+2 ; i++){ bitsMessage[i] = new int[8]; // Divide os dados em bits for(j = 0 ; j < 8 ; j++){ @@ -25,7 +31,7 @@ void SubMessage::setParity(){ // Soma os bits verticalmente for(j = 0 ; j < 8 ; j++){ bitsParity[j] = 0; - for(i = 0 ; i < getSize() ; i++){ + for(i = 0 ; i < getSize()+2 ; i++){ bitsParity[j] = bitsParity[j] + bitsMessage[i][j]; } // Caso a soma vertical de uma coluna for par, bitsParity recebe 1, @@ -38,7 +44,7 @@ void SubMessage::setParity(){ // Atribui os bits para parity (variável de paridade do objeto) parity = (parity << 1) | bitsParity[j]; } - for(i = 0 ; i < getSize() ; i++){ + for(i = 0 ; i < getSize()+2 ; i++){ if(bitsMessage[i]){ delete(bitsMessage[i]); } @@ -141,26 +147,26 @@ int SubMessage::checkParity(){ int i, j, bitsParity[8]; unsigned char parityTest; -cout << "AQUI" << endl; // Alocação da matriz de bits -cout << "this-getSize = " << getSize() << endl; -// bitsMessage = (int**) malloc(sizeof(int*)*getSize()); - bitsMessage = new int*[getSize()]; - //bitsMessage = (int**) realloc(bitsMessage,sizeof(int*)*getSize()); -cout << "AQUI2" << endl; - for(i = 0 ; i < getSize() ; i++){ + bitsMessage = new int*[getSize()+2]; + bitsMessage[0] = new int[8]; + bitsMessage[1] = new int[8]; + for(j = 0 ; j < 8 ; j++){ + bitsMessage[0][j] = ((((sizSeqTyp >> 8) & 0x00FF) >> (7-j)) & 0x01); + bitsMessage[1][j] = ((((sizSeqTyp >> 0) & 0x00FF) >> (7-j)) & 0x01); + } + for(i = 2 ; i < getSize()+2 ; i++){ bitsMessage[i] = new int[8]; // Divide os dados em bits for(j = 0 ; j < 8 ; j++){ bitsMessage[i][j] = ((data[i] >> (7-j)) & 0x01); } } -cout << "AQUI 3" << endl; // Soma os bits verticalmente for(j = 0 ; j < 8 ; j++){ bitsParity[j] = 0; - for(i = 0 ; i < getSize() ; i++){ + for(i = 0 ; i < getSize()+2 ; i++){ bitsParity[j] = bitsParity[j] + bitsMessage[i][j]; } // Caso a soma vertical de uma coluna for par, bitsParity recebe 1, @@ -173,13 +179,11 @@ cout << "AQUI 3" << endl; // Atribui os bits para parity (variável de paridade do objeto) parityTest = (parityTest << 1) | bitsParity[j]; } -cout << "AQUI 4" << endl; - for(i = 0 ; i < getSize() ; i++){ + for(i = 0 ; i < getSize()+2 ; i++){ if(bitsMessage[i]){ delete(bitsMessage[i]); } } -cout << "AQUI 5" << endl; delete(bitsMessage); cout << "AQUI 6" << endl; if (parityTest == parity){