diff --git a/src/messages.cpp b/src/messages.cpp index fd5ffafad89943df7d2b23cab689c765751dd028..42bf901e7c55af8231141a17cb9bb905ace018f9 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -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){ - error = send(soquete, subMensagem[0].objToString() , size+4, 0); + 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,10 +93,18 @@ 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(answer.getData()[0] == '1'){ - success = 1; // YAY - } else { - cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; + if(numberOfMessages == 1){ + if(answer.getData()[0] == '1'){ + success = 1; // YAY + } else { + cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl; + } + } 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; + } } } } @@ -103,33 +114,6 @@ int Message::sendMessage(unsigned char* stringMessage){ } } 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'){ - 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){ i = 0; while (i < numberOfMessages - 3){ @@ -138,21 +122,29 @@ 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)){ - 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 + 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 + } } } } else {