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