From 7e5df02d612f567356ba4f610dc931512b4e7301 Mon Sep 17 00:00:00 2001 From: Victor Perszel <vlp14@inf.ufpr.br> Date: Sun, 29 Nov 2015 16:17:15 -0200 Subject: [PATCH] Erros sendmessage arrumados --- include/connectionRawSocket.h | 2 + src/main.cpp | 5 +- src/messages.cpp | 133 +++++++++++++++++++--------------- src/submessages.cpp | 7 +- 4 files changed, 85 insertions(+), 62 deletions(-) diff --git a/include/connectionRawSocket.h b/include/connectionRawSocket.h index 2915dc5..91ba9b0 100644 --- a/include/connectionRawSocket.h +++ b/include/connectionRawSocket.h @@ -12,12 +12,14 @@ #include <stdlib.h> #include <string.h> #include <stdio.h> +#include <stdlib.h> #include <iostream> #include <sstream> #include <vector> #include <string> #include <cstdlib> #include <poll.h> +#include <bitset> using namespace std; diff --git a/src/main.cpp b/src/main.cpp index 1089f95..728f51f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,15 +3,16 @@ #include "connectionRawSocket.h" #include "messages.h" -#include "submessages.h" using namespace std; +int soquete; + int main(int argc, char *argv[]) { unsigned char dados[64] = "mensagem de teste"; unsigned char *saida; - subMessage mesg; + SubMessage mesg; int i; //42 = 101010 / 21 = 010101 / 6 = 0110 diff --git a/src/messages.cpp b/src/messages.cpp index 4f3b079..cc48a91 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -7,12 +7,12 @@ int Message::sendMessage(unsigned char* stringMessage){ int numberOfMessages, sizeLastMessage, size=0; - int i, j, error, tipo, rv, success = 0; + int i, j, k, error, tipo, rv, success = 0; unsigned char* subData; // a parte da mensagem que vai em cada sequencia - unsigned char* mesgReturn; // mensagem que recebe de retorno (ack, erro, etc) char *receiptMessage = (char*)malloc(sizeof(char*)*64); - char erro1[10], erro2[10], sucesso[10], buffer[10]; + char *erro1, *erro2, *sucesso, *buffer; struct pollfd ufds[1]; // usado para timeout em recv + SubMessage answer; // Calcula o tamanho da msg while( stringMessage[size] != '\0'){ @@ -30,29 +30,33 @@ int Message::sendMessage(unsigned char* stringMessage){ // Cria as sub mensagens SubMessage subMensagem[numberOfMessages]; - // Atribui os tipo + // Atribui os tipos da mensagem if(stringMessage[0] == 'l' && stringMessage[1] == 's'){ - tipo = 0x4; + tipo = 4; } else if (stringMessage[0] == 'c' && stringMessage[1] == 'd'){ - tipo = 0x3; + tipo = 3; } else if (stringMessage[0] == 'p' && stringMessage[1] == 'u' && stringMessage[2] == 't') { - tipo = 0x5; + tipo = 5; } else if (stringMessage[0] == 'g' && stringMessage[1] == 'e' && stringMessage[10] == 't') { - tipo = 0x6; + tipo = 6; } else { - tipo = 0xD; + tipo = 13; // 13 = 0xD --> Dados } // string usada para dividir a mensagem de entrada e colocar na parte de data das SubMessages subData = (unsigned char*) malloc(sizeof(unsigned char) * 64); // Divide a mensagem + k = 0; // k é a numero da sequencia na submensagem for(i = 0; i < numberOfMessages-1; ++i){ for(j = 0; j < 64; ++j){ subData[j] = stringMessage[(i*64)+j]; } - subMensagem[i].setStartMessage(); - subMensagem[i].setData(subData, tipo, i); + subMensagem[i].setData(subData, tipo, k); + ++k; + if(k == 64){ // Caso estoure o número de bits de sequencia + k = 0; + } } if (sizeLastMessage){ // Caso a última mensagem não seja completa realoca subData para o tamanho da última mensagem @@ -60,30 +64,29 @@ int Message::sendMessage(unsigned char* stringMessage){ for(j = 0; j < sizeLastMessage; ++j){ subData[j] = stringMessage[(i*64)+j]; } - subMensagem[i].setStartMessage(); - subMensagem[i].setData(subData, tipo, i); + subMensagem[i].setData(subData, tipo, k); }else{ // Caso contrario continua com o tamanho maior for(j = 0; j < 64; ++j){ subData[j] = stringMessage[(i*64)+j]; } - subMensagem[i].setStartMessage(); - subMensagem[i].setData(subData, tipo, i); + subMensagem[i].setData(subData, tipo, k); } // Caso haja só uma ou duas mensagens - if (numberOfMessages < 3){ - SubMessage answer; + if (numberOfMessages < 4){ while(!success){ - if (numberOfMessages == 1){ - error = send(soquete, subMensagem[0].objToString() , size+4, 0); - } else if (numberOfMessages == 2){ - error = send(soquete, subMensagem[0].objToString() , 68, 0); - error = send(soquete, subMensagem[1].objToString() , sizeLastMessage+4, 0); - } else { + if(numberOfMessages < 1) { cout << "Algo parece estranho, sua mensagem contém conteúdo?\n" << endl; cout << "Erro: Mensagem nula (messages.cpp::sendMessage)" << 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::sendMessage)" << endl; @@ -98,7 +101,7 @@ int Message::sendMessage(unsigned char* stringMessage){ if(rv == -1){ cout << "Erro no recebimento de resposta (messages.cpp::sendMessage)" << endl; } else { - recv(soquete, receiptMessage, 64*sizeof(char), 0); + 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 @@ -108,8 +111,14 @@ int Message::sendMessage(unsigned char* stringMessage){ } else { cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; } - } else { // numero de mensagens = 2 - if(answer.getData() == '1 1'){ // aceitou ambas as msgs + } else if (numberOfMessages == 2){ // numero de mensagens = 2 + if(answer.getData() == (unsigned char*)"1 1"){ // aceitou ambas as msgs + success = 1; // YAY + } else { + cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; + } + } else { // numbero de mensagens = 3 + if(answer.getData() == (unsigned char*)"1 2"){ // aceitou ambas as msgs success = 1; // YAY } else { cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; @@ -123,43 +132,53 @@ int Message::sendMessage(unsigned char* stringMessage){ } } success = 0; - } else if (numberOfMessages > 2){ + } else if (numberOfMessages > 3){ i = 0; - while (i < numberOfMessages - 3){ - error = send(soquete, subMensagem[i].objToString() , 68, 0); - error = send(soquete, subMensagem[i+1].objToString() , 68, 0); - error = send(soquete, subMensagem[i+2].objToString() , 68, 0); + while (i < numberOfMessages - 2){ + error = send(soquete, subMensagem[i].objToString() , subMensagem[i].getSize()+4, 0); + error = send(soquete, subMensagem[i+1].objToString() , subMensagem[i].getSize()+4, 0); + error = send(soquete, subMensagem[i+2].objToString() , subMensagem[i].getSize()+4, 0); - // recebe resposta - ufds[0].fd = soquete; - ufds[0].events = POLLIN; - // 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::sendMessage)" << endl; - } else { - answer.stringToObj(string); - // Lê começo da mensagem e vê se tem o delimitador de início - if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110 - erro1 = '1 ' + itoa(i, buffer, 10); - erro2 = '1 ' + itoa(i+1, buffer, 10); - sucesso = '1 ' + itoa(i+2, buffer, 10); - if(answer.getData() == erro1){ - i += 1; - } else if (answer.getData() == erro2){ - i += 2; - } else if (answer.getData() == sucesso){ - i += 3; - } else { - // Nenhuma das 3 mensagens foi recebida + success = 0; + k = 0; + while((k < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo + // recebe resposta + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + // 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::sendMessage)" << endl; + return -1; + } else { + 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 { + cout << "Tempo limite de resposta excedido :c\n" << endl; + cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl; } - } else { - cout << "Tempo limite de resposta excedido :c\n" << endl; - cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl; + k++; } } } + return 0; } diff --git a/src/submessages.cpp b/src/submessages.cpp index 54c4b66..05d70f6 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -117,13 +117,14 @@ void SubMessage::stringToObj(unsigned char* string){ sizSeqTyp = (sizSeqTyp << 8) | string[2]; // aloca a área de dados. - data = new unsigned char[this->getSize()]; + int size = this->getSize(); + data = new unsigned char[size]; // Atribuição de dados. - for(int i = 0; i < size-1; ++i){ + for(int i = 0; i < size+3; ++i){ data[i] = string[i+3]; } // Passagem da paridade. - parity = string[size-1]; + parity = string[size+3]; } -- GitLab