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

Timeout melhorado

parent 94e13750
No related branches found
No related tags found
No related merge requests found
......@@ -8,8 +8,8 @@ SRC=./src
OBJ=./obj
FLAGS = -Wall
main: connectionRawSocket messages
$(CC) $(SRC)/main.cpp $(OBJ)/connectionRawSocket.o $(OBJ)/messages.o $(FLAGS) -I$(INCLUDE) -L$(LIB) -o connection
main: connectionRawSocket messages submessages
$(CC) $(SRC)/main.cpp $(OBJ)/connectionRawSocket.o $(OBJ)/messages.o $(OBJ)/submessages.o $(FLAGS) -I$(INCLUDE) -L$(LIB) -o connection
connectionRawSocket:
$(CC) -c $(SRC)/connectionRawSocket.cpp $(FLAGS) -I$(INCLUDE) -o $(OBJ)/connectionRawSocket.o
......@@ -19,5 +19,9 @@ messages:
$(CC) -c $(SRC)/messages.cpp $(FLAGS) -I$(INCLUDE) -o $(OBJ)/messages.o
ar -cru $(LIB)/messages.a $(OBJ)/messages.o
submessages:
$(CC) -c $(SRC)/submessages.cpp $(FLAGS) -I$(INCLUDE) -o $(OBJ)/submessages.o
ar -cru $(LIB)/submessages.a $(OBJ)/submessages.o
clean:
rm connection $(SRC)/*~ $(OBJ)/*o $(LIB)/*a
......@@ -2,6 +2,7 @@
// 2015
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/ethernet.h>
......@@ -14,7 +15,12 @@
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstdlib>
#include <poll.h>
using namespace std;
int openRawSocket(char *device);
extern int soquete;
// Implementado por: Eduardo Machado e Victor Perszel
// 2015
#include <iostream>
#include <sstream>
#include <vector>
#include "connectionRawSocket.h"
#include "submessages.h"
using namespace std;
// classe ainda não completa.
class SubMessage{
private:
unsigned char startMessage; // Delimitador de início.
int sizSeqTyp; // 6 bits para tamanho, 6 bits para sequencia e 4 bits para o tipo.
unsigned char *data; // Área para envio dos dados.
unsigned char parity; // 1 Byte para a paridade vertical (detecção de erros).
// Calcula a paridade da mensagem, esse método está como privado para ser
// chamado dentro de setData, onde nós podemos setar os dados e já calcular
// a paridade da mensagem.
void setParity();
void setStartMessage();
public:
//Concatena os bits de tamanho, sequencia e tipo em um só chamado SizSeqTyp
//No final, SizSeqTyp tem um binario de (SSSSSSQQQQQQTTTT)
//Onde S = binario do tamanho, Q = binario da sequencia e T = binario do tipo
void setSizSeqTyp(int, int, int);
// Aqui nós entramos com os dados e o tamanho dos dados (em bytes).
void setData(unsigned char*, int, int);
void getStartMessage();
unsigned char getParity(); //Retorna a paridade
int getSize(); //Retorna o tamanho
int getSeq(); //Retorna a sequencia
int getType(); //Retorna o tipo
unsigned char* getData(); //Retorna os dados
unsigned char* objToString();
void stringToObj(unsigned char*,int);
};
// Essa é a classe para definir uma mensagem completa
// Aqui nós podemos colocar os métodos para separar o arquivo em várias SubMessages
class Message{
......
// Implementado por: Eduardo Machado e Victor Perszel
// 2015
#include "connectionRawSocket.h"
using namespace std;
class SubMessage{
private:
unsigned char startMessage; // Delimitador de início.
int sizSeqTyp; // 6 bits para tamanho, 6 bits para sequencia e 4 bits para o tipo.
unsigned char *data; // Área para envio dos dados.
unsigned char parity; // 1 Byte para a paridade vertical (detecção de erros).
// Calcula a paridade da mensagem, esse método está como privado para ser
// chamado dentro de setData, onde nós podemos setar os dados e já calcular
// a paridade da mensagem.
void setParity();
void setStartMessage();
public:
//Concatena os bits de tamanho, sequencia e tipo em um só chamado SizSeqTyp
//No final, SizSeqTyp tem um binario de (SSSSSSQQQQQQTTTT)
//Onde S = binario do tamanho, Q = binario da sequencia e T = binario do tipo
void setSizSeqTyp(int, int, int);
// Aqui nós entramos com os dados e o tamanho dos dados (em bytes).
void setData(unsigned char*, int, int);
int getStartMessage();
unsigned char getParity(); //Retorna a paridade
int getSize(); //Retorna o tamanho
int getSeq(); //Retorna a sequencia
int getType(); //Retorna o tipo
unsigned char* getData(); //Retorna os dados
unsigned char* objToString();
void stringToObj(unsigned char*);
};
// Implementado por: Eduardo Machado e Victor Perszel
// 2015
#include <iostream>
#include <string>
#include <sstream>
#include <bitset>
#include "connectionRawSocket.h"
#include "messages.h"
#include "submessages.h"
using namespace std;
......
// Implementado por: Eduardo Machado e Victor Perszel
// 2015
#include <iostream>
#include <string>
#include <sstream>
#include "messages.h"
//######################### MÉTODOS DA CLASSE Message #########################
int Message::sendMessage(unsigned char* stringMessage){
int numberOfMessages, sizeLastMessage, size=0;
int i, j, tipo, success = 0;
int i, j, 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];
struct timeval tv;
struct pollfd ufds[1];
// Calcula o tamanho da msg
while( stringMessage[size] != '\0'){
......@@ -43,7 +42,7 @@ int Message::sendMessage(unsigned char* stringMessage){
tipo = 0xD;
}
subData = malloc (sizeof(unsigned char) * 64);
subData = (unsigned char*) malloc(sizeof(unsigned char) * 64);
// Divide a mensagem
for(i = 0; i < numberOfMessages-1; ++i){
for(j = 0; j < 64; ++j){
......@@ -52,7 +51,7 @@ int Message::sendMessage(unsigned char* stringMessage){
subMensagem[i].setData(subData, tipo, i);
}
if (sizeLastMessage){
subData = realloc(subData, sizeof(unsigned char) * sizeLastMessage);
subData = (unsigned char*) realloc(subData, sizeof(unsigned char) * sizeLastMessage);
for(j = 0; j < sizeLastMessage; ++j){
subData[j] = stringMessage[(i*64)+j];
}
......@@ -67,33 +66,41 @@ int Message::sendMessage(unsigned char* stringMessage){
// Deveríamos verificar se é cd ls put ou get, não?
// Assim colocamos 3, 4, 5 ou 6, respectivamente, antes da msg
tv.tv_sec = 5; // TIMEOUT de 5 segundos
tv.tv_usec = 0;
// tv.tv_sec = 5; // TIMEOUT de 5 segundos
// tv.tv_usec = 0;
// Caso haja só uma mensagem
if (numberOfMessages == 1){
SubMessage answer;
while(!success){
error = send(socket, subMessage[0].objToString() , size+4, 0);
error = send(soquete, subMensagem[0].objToString() , size+4, 0);
if(error == -1){
cout << "Problema com o envio da mensagem (messages.cpp::sendMessage)" << endl;
}
// recebe resposta
if(setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (unsigned char *)&tv,sizeof(struct timeval) > 0){
answer.stringToObj(unsigned char* string)
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 {
recv(soquete, receiptMessage, 64*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() == 127){ // 127 = 01111110
if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
if(answer.getData()[0] == '1'){
success = 1; // YAY
} else {
cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl;
}
}
}
} else {
cout << "Tempo limite de resposta excedido :c\n" << endl;
cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl;
}
}
}
success = 0;
} else if (numberOfMessages == 2){
......@@ -101,16 +108,16 @@ int Message::sendMessage(unsigned char* stringMessage){
// Único caso em que se reenvia tudo se houver erro
SubMessage answer;
while(!success){
error = send(socket, subMessage[0].objToString() , 68, 0);
error = send(socket, subMessage[1].objToString() , sizeLastMessage+4, 0);
error = send(soquete, subMensagem[0].objToString() , 68, 0);
error = send(soquete, subMensagem[1].objToString() , sizeLastMessage+4, 0);
if(error == -1){
cout << "Problema com o envio da mensagem (messages.cpp::sendMessage)" << endl;
}
// recebe resposta
if(setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (unsigned char *)&tv,sizeof(struct timeval) > 0){
answer.stringToObj(unsigned char* string)
if((setsockopt(soquete, SOL_SOCKET, SO_RCVTIMEO, (unsigned char *)&tv,sizeof(struct timeval)) >= 0)){
answer.stringToObj(string);
// Lê começo da mensagem e vê se tem o delimitador de início
if(answer.getStartMessage() == 127){ // 127 = 01111110
if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
if(answer.getData()[0] == '1'){
success = 1; // YAY
} else {
......@@ -126,15 +133,15 @@ int Message::sendMessage(unsigned char* stringMessage){
} else if (numberOfMessages > 2){
i = 0;
while (i < numberOfMessages - 3){
error = send(socket, subMessage[i].objToString() , 68, 0);
error = send(socket, subMessage[i+1].objToString() , 68, 0);
error = send(socket, subMessage[i+2].objToString() , 68, 0);
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);
// recebe resposta
if(setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (unsigned char *)&tv,sizeof(struct timeval) >= 0){
answer.stringToObj(unsigned char* string)
if((setsockopt(soquete, SOL_SOCKET, SO_RCVTIMEO, (unsigned char *)&tv,sizeof(struct timeval)) >= 0)){
answer.stringToObj(string);
// Lê começo da mensagem e vê se tem o delimitador de início
if(answer.getStartMessage() == 127){ // 127 = 01111110
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);
......
// Implementado por: Eduardo Machado e Victor Perszel
// 2015
#include <iostream>
#include <string>
#include <sstream>
#include <bitset>
#include <vector>
#include "messages.h"
#include "submessages.h"
//####################### MÉTODOS DA CLASSE SubMessage ########################
......@@ -113,10 +108,7 @@ unsigned char* SubMessage::objToString(){
return str;
}
void SubMessage::stringToObj(unsigned char* string, int size){
// aloca a área de dados.
data = new unsigned char[size-4];
void SubMessage::stringToObj(unsigned char* string){
// Delimitador de início
startMessage = string[0];
......@@ -124,6 +116,9 @@ void SubMessage::stringToObj(unsigned char* string, int size){
sizSeqTyp = (sizSeqTyp << 0) | string[1];
sizSeqTyp = (sizSeqTyp << 8) | string[2];
// aloca a área de dados.
data = new unsigned char[this->getSize()];
// Atribuição de dados.
for(int i = 0; i < size-1; ++i){
data[i] = string[i+3];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment