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

Timeout melhorado para 2 ou mais mensagens

parent ee686c38
Branches
No related tags found
No related merge requests found
......@@ -12,7 +12,6 @@ int Message::sendMessage(unsigned char* stringMessage){
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
......@@ -63,20 +62,24 @@ int Message::sendMessage(unsigned char* stringMessage){
subMensagem[i].setData(subData, tipo, i);
}
// 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;
// Caso haja só uma mensagem
if (numberOfMessages == 1){
// Caso haja só uma ou duas mensagens
if (numberOfMessages < 3){
SubMessage answer;
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 {
cout << "Algo parece estranho, sua mensagem contém conteúdo?\n" << endl;
cout << "Erro: Mensagem nula (messages.cpp::sendMessage)" << endl;
}
if(error == -1){
cout << "Problema com o envio da mensagem (messages.cpp::sendMessage)" << endl;
}
// recebe resposta
ufds[0].fd = soquete;
ufds[0].events = POLLIN;
......@@ -90,40 +93,21 @@ int Message::sendMessage(unsigned char* stringMessage){
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
if(numberOfMessages == 1){
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){
// Caso hajam 2 mensagens
// Único caso em que se reenvia tudo se houver erro
SubMessage answer;
while(!success){
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(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() == 0x7E){ // 0x7E = 01111110
if(answer.getData()[0] == '1'){
} else { // numero de mensagens = 2
if(answer.getData() == '1 1'){ // aceitou ambas as msgs
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;
......@@ -138,7 +122,14 @@ int Message::sendMessage(unsigned char* stringMessage){
error = send(soquete, subMensagem[i+2].objToString() , 68, 0);
// recebe resposta
if((setsockopt(soquete, SOL_SOCKET, SO_RCVTIMEO, (unsigned char *)&tv,sizeof(struct timeval)) >= 0)){
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
......@@ -155,6 +146,7 @@ int Message::sendMessage(unsigned char* stringMessage){
// Nenhuma das 3 mensagens foi recebida
}
}
}
} else {
cout << "Tempo limite de resposta excedido :c\n" << endl;
cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment