Skip to content
Snippets Groups Projects
Commit 7e5df02d authored by Victor Perszel's avatar Victor Perszel :top:
Browse files

Erros sendmessage arrumados

parent d92c0afa
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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
......
......@@ -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,13 +132,16 @@ 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);
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;
......@@ -138,21 +150,25 @@ int Message::sendMessage(unsigned char* stringMessage){
if(rv){
if(rv == -1){
cout << "Erro no recebimento de resposta (messages.cpp::sendMessage)" << endl;
return -1;
} else {
answer.stringToObj(string);
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
erro1 = '1 ' + itoa(i, buffer, 10);
erro2 = '1 ' + itoa(i+1, buffer, 10);
sucesso = '1 ' + itoa(i+2, buffer, 10);
if(answer.getData() == erro1){
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() == erro2){
} else if (answer.getData() == (unsigned char*)erro2){
i += 2;
} else if (answer.getData() == sucesso){
} else if (answer.getData() == (unsigned char*)sucesso){
i += 3;
} else {
// Nenhuma das 3 mensagens foi recebida
success = 0;
}
}
}
}
......@@ -160,6 +176,9 @@ int Message::sendMessage(unsigned char* stringMessage){
cout << "Tempo limite de resposta excedido :c\n" << endl;
cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl;
}
k++;
}
}
}
return 0;
}
......@@ -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];
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment