From 191532a2f16d803fc3cdd7a9c58d2b990e984fd1 Mon Sep 17 00:00:00 2001
From: Nico <nigr21@inf.ufpr.br>
Date: Sun, 26 Feb 2023 23:51:04 -0300
Subject: [PATCH] pra mensagem deu boa acho

---
 headers/client.h  |  26 +-
 headers/conexao.h |  14 +-
 headers/macros.h  |   3 -
 headers/server.h  | 645 +++++++++++++++++++++++++---------------------
 todo.txt          |   9 +-
 5 files changed, 378 insertions(+), 319 deletions(-)

diff --git a/headers/client.h b/headers/client.h
index f4945e4..eab04d1 100644
--- a/headers/client.h
+++ b/headers/client.h
@@ -96,7 +96,9 @@ frame* client::send_frame_socket(frame *f) {
   int retries = 0;
   do {
     // envia um frame da fila
-    socket->send_frame(f);
+    int bytesSent = socket->send_frame(f);
+    if ( bytesSent == -1 ) { return NULL; }
+    
     response = receive_ack_nack();
     if(!response)
       return NULL;
@@ -155,50 +157,62 @@ int client::send_frames(vector<frame *> frames) {
   cout << "\tstart transmission\n";
   if (!start_transmission()) { return 0; }
   cout << "\t ->>> started transmission <<< -\n";
+
   // Cria a fila de frames
   queue<int> janela;
   int frameCounter;
   int iniJanela = 0;
   while (iniJanela < frames.size()) {
+
     //manda todos os frames de uma vez só
     for(frameCounter = 0; frameCounter < TAM_JANELA; frameCounter++){
-      if(iniJanela+frameCounter == frames.size())
-        break;
+      if(iniJanela+frameCounter == frames.size()) { break; }
       janela.push(frameCounter);
       
       cout << "\tEnviando frame\n";
       frames[iniJanela]->imprime(HEX);
       
-      if(socket->send_frame(frames[iniJanela+frameCounter]) >= 0)
-        cout << "\tFrame enviado com sucesso\n";
+      if (socket->send_frame(frames[iniJanela+frameCounter]) == -1)
+      {
+        cout << "Falha ao enviar o frame\n";
+        return 0;
+      }
+
+      cout << "\tFrame enviado com sucesso\n";
     }
 
+    // Recebe a resposta do servidor
     for (int i = 0; i < min((int)TAM_JANELA, (int)frames.size()); i++) {
       frame* res = NULL;
       int retries = 0;
+
       do {
         res = receive_ack_nack();
         retries++;
       } while (res == NULL && retries < NUM_RETRIES);
 
       if(res == NULL && retries == NUM_RETRIES){
-        break;
+        return 0;
       }
       
       if(res->get_tipo() == NACK && res->get_dado()[0] == janela.front()){
+        cout << "NACK " << (int)res->get_dado()[0] << " recebido\n" ;
         iniJanela += res->get_dado()[0];
         janela.pop();
         break;
       }
 
       if(res->get_tipo() == ACK && res->get_dado()[0] == janela.front()){
+        cout << "ACK " << (int)res->get_dado()[0] << " recebido\n" ;
         iniJanela++;
         janela.pop();
       }
+
       else{
         i--;
       }
     }
+
     //apaga a janela
     while(! janela.empty()) janela.pop();
   }
diff --git a/headers/conexao.h b/headers/conexao.h
index 072f624..887ffe4 100644
--- a/headers/conexao.h
+++ b/headers/conexao.h
@@ -23,8 +23,9 @@
 
 using namespace std;
 
-#define BYTE "%02x"
-#define NUM_RETRIES 100
+#define NUM_RETRIES 10
+#define TAM_JANELA 2
+
 
 class conexao {
 private:
@@ -89,10 +90,6 @@ frame *conexao::receive_frame() {
 
   do {
     byteRecv = recv(device, bufferReceived, sizeof(frame) * 2, 0);
-    //    for (int i = 0; i < byteRecv; i++) {
-    //      cout << hex << (int(bufferReceived[i])&0xff) << " ";
-    //    }
-    cout << "\n";
     if ((byteRecv > 0) && (bufferReceived[0] == INI)) {
       frame *f = new frame;
       remove_escapes(bufferReceived, (char *)f);
@@ -122,7 +119,10 @@ int conexao::send_frame(frame *f) {
     cout << hex << (int(bufferSend[i]) & 0xff) << " ";
   }
   cout << "\n";
-  if (byteSend < 0) { cout << "Erro no sendto" << byteSend << "\n"; }
+  if (byteSend < 0) { 
+    cout << "Erro no sendto" << byteSend << "\n"; 
+    return -1;
+  }
 
   return byteSend;
 }
diff --git a/headers/macros.h b/headers/macros.h
index ef6923e..a936d2f 100644
--- a/headers/macros.h
+++ b/headers/macros.h
@@ -4,9 +4,6 @@
 #define UC unsigned char
 #define UI unsigned int
 
-//tamanho da janela 
-#define TAM_JANELA 2
-
 // Macro que cria uma sequencia com o 1 deslocado "des" posicoes a direita
 #define MASKR(des) (1 << des)
 
diff --git a/headers/server.h b/headers/server.h
index 4f3ac04..18e0123 100644
--- a/headers/server.h
+++ b/headers/server.h
@@ -32,30 +32,32 @@ class server {
 
 private:
   // --------- Dados ---------- //
-  int soquete;
+  //int soquete;
   int tipoReceivingFrames;
 
   conexao *socket;
 
-  vector<frame *> framesMidia;
+  //vector<frame *> framesMidia;
 
   // ---------- Funcoes -------- //
+
+  frame *create_ack_nack(int tipo, int seq);
   int send_nack(frame *fReceive);
   int send_ack(frame *fReceive);
-  void send_confirm(frame *fReceive);
-  void receive_text(frame *f);
-  void receive_midia(frame *f);
-  frame *receive_frame_socket();
-  int receive_valid_frame(frame **f);
-  unsigned long chk_available_size();
-  int receive_file_size(frame *f);
-  void start_receveing_message();
-  bool create_received_dir();
-  string receive_file_name();
-  int receive_file_data(string fileName);
-  bool verify_crc8(frame *f);
   bool verify_seq(int seq, int lastSeq);
+  //void send_confirm(frame *fReceive);
+  //void receive_text(frame *f);
+  //void receive_midia(frame *f);
+  //int receive_valid_frame(frame **f);
+  //unsigned long chk_available_size();
+  //int receive_file_size(frame *f);
+  //bool create_received_dir();
+  //string receive_file_name();
+  //int receive_file_data(string fileName);
+  //bool verify_crc8(frame *f);
+  frame *receive_frame_socket();
   queue<frame *> receive_frames_window(int lastSeq);
+  void start_receveing_message();
 
 public:
   // ------- Construtores ------ //
@@ -67,188 +69,77 @@ public:
 
 // ------------------------------ PRIVATE --------------------------------- //
 /**
- * @brief function that sends a ack frame to the target
+ * @brief function that creates a nack or a nack 
  *
- * @param fReceive frame received
+ * @param tipo ack or nack
+ * @param seq  ack or nack sequence number
  * @return int
  */
-int server::send_ack(frame *fReceive) {
-
-  frame *ack = new frame();
 
-  ack->set_tipo(ACK);
-  vector<char> seq;
-  seq.push_back(char(fReceive->get_seq()));
-  ack->set_dado(seq);
-
-  int ackSent = 0;
-  ackSent = socket->send_frame(ack);
+frame *server::create_ack_nack(int tipo, int seq)
+{
+  vector<char> seq_char;
+  frame *f = new frame();
 
-  cout << "ACK enviado\n";
+  f->set_tipo(tipo);
+  vector<char> seq_v;
+  seq_v.push_back(char(seq));
+  f->set_dado(seq_v);
 
-  return ackSent;
+  return f;
 }
 
 /**
- * @brief function that sends a nack frame to the target
+ * @brief function that sends a ack frame to the target
  *
  * @param fReceive frame received
  * @return int
  */
-int server::send_nack(frame *fReceive) {
-
-  frame *nack = new frame();
-
-  nack->set_tipo(NACK);
-  vector<char> seq;
-  seq.push_back(char(fReceive->get_seq()));
-  nack->set_dado(seq);
-
-  int nackSent = 0;
-  nackSent = socket->send_frame(nack);
-
-  cout << "NACK enviado\n";
-
-  return nackSent;
-}
-
-// Recebe uma mensagem em forma de texto
-void server::receive_text(frame *f) {
-  string textoReceive;
-  textoReceive.append(f->get_dado());
-  int lastSeq = f->get_seq();
-
-  do {
-    if (!receive_valid_frame(&f)) { return; }
-    if (f->get_tipo() != TEXTO) { continue; }
-    if (f->get_seq() == lastSeq) { continue; }
-
-    lastSeq = f->get_seq();
-    textoReceive.append(f->get_dado());
-  } while (f->get_tipo() != FIMT);
+int server::send_ack(frame *fReceive) {
 
-  cout << "Mensagem recebida: " << textoReceive << "\n";
-}
+  frame *ack = create_ack_nack(ACK, fReceive->get_seq());
 
-// Verifica o espaco disponivel em disco
-unsigned long server::chk_available_size() {
-  struct statvfs st;
-  if (statvfs(FILE_DESTINATION, &st) == -1) {
-    cout << "Erro no statvfs, abortado\n";
-    // send_error();
-    return -1;
+  int ackSent = socket->send_frame(ack);
+  if ( ackSent == -1 ) 
+  { 
+    cout << "Falha ao enviar o ack\n";
+    return -1; 
   }
 
-  return st.f_bsize * st.f_bavail;
-}
-
-// Recebe o frame com o tamanho do arquivo
-int server::receive_file_size(frame *f) {
-
-  /*
-     > verifica a sequencia do frame e o tipo
-     > se o frame nao for a sequencia esperada, envia um ack(0) e espera receber
-     a sequencia esperada > se o frame for o esperado, verifica o crc8 > se o
-     crc estiver certo, envia um ack e continua > se estiver errado, envia um
-     nack e espera receber o proximo frame
-  */
-  cout << "Recebendo tamanho do frame\n";
-  do {
-    if ( f->get_tipo() != MIDIA ) { continue; }
-    if ( f->get_seq() == 0 && verify_crc8(f) ) { break; }
-    
-    if ( f->get_seq() != 0 )
-      cout << "Sequencia errada\n";
-    else
-      cout << "Crc errado\n";
-
-    cout << "Aguardando frame\n";
-
-    f = receive_frame_socket();
-    if (!f) { return 0; }
-
-    cout << "Frame recebido\n";
-
-  } while (true);
+  cout << "ACK " << (int) fReceive->get_seq() << " enviado\n";
 
-  unsigned long availSize = chk_available_size();
-  if (availSize == -1) { return -1; }
-
-  cout << "Frame file size:" << f->get_dado() << "\n";
-  int fileSize = stoi(f->get_dado());
-
-  if (fileSize > availSize * 0.9) {
-    cout << "Tamanho do arquivo muito grande, abortado\n";
-    // send_error();
-    return 0;
-  }
-
-  cout << "Espaco suficiente em disco\n";
-  return 1;
+  return ackSent;
 }
 
-bool server::create_received_dir() {
+/**
+ * @brief function that sends a nack frame to the target
+ *
+ * @param fReceive frame received
+ * @return int
+ */
+int server::send_nack(frame *fReceive) {
 
-  // check if the directory exists
-  struct stat info;
-  if (stat(FILE_DESTINATION, &info) == 0 && (info.st_mode & S_IFDIR)) {
-    cout << "Diretorio ja existe\n";
-    return true;
-  }
+  frame *nack = create_ack_nack(NACK, fReceive->get_seq());
 
-  // create the directory
-  if (mkdir(FILE_DESTINATION, 0700) == -1) {
-    cout << "Erro ao criar o diretorio\n";
-    return false;
+  int nackSent = socket->send_frame(nack);
+  if ( nackSent == -1 ) { 
+    cout << "Falha ao enviar o nack";
+    return -1; 
   }
 
-  cout << "Diretorio criado com sucesso\n";
-  return true;
-}
-
-string server::receive_file_name() {
-  frame *fReceive;
-
-  // Aguarda receber um frame do tipo midia com o nome do arquivo
-  // E com a sequencia de numero 2
-  /*
-    > recebe o frame e verifica se o tipo e a sequencia estao corretos
-    > se estiverem, verifica o crc8
-    > se estiver correto, envia um ack e continua
-    > se estiver errado, envia um nack e espera receber o proximo frame
-  */
-  cout << "Recebendo nome do arquivo\n";
-
-  do {
-    cout << "Aguardando frame\n";
-    fReceive = receive_frame_socket();
-    if (!fReceive) { return string{}; }
-
-    cout << "Frame recebido\n";
-
-    if (fReceive->get_tipo() != MIDIA) { continue; }
-    if ( fReceive->get_seq() != 1 )    
-    { 
-      cout << "Sequencia errada\n";
-      fReceive->set_seq(0);
-      send_ack(fReceive);
-      continue;
-    }
+  cout << "NACK " << (int) fReceive->get_seq() << " enviado\n";
 
-    if (verify_crc8(fReceive)) { break; }
-
-    cout << "Crc invalido, aguardando retransmissao\n";
-
-  } while (true);
-
-  cout << "Nome do arquivo recebido com sucesso\n";
-  cout << "Nome do arquivo: " << fReceive->get_dado() << "\n";
-
-  return string(fReceive->get_dado());
+  return nackSent;
 }
 
+/**
+ * @brief function that verify if two numbers are sequential
+ *
+ * @param seq
+ * @param lastSeq
+ * @return bool 
+ */
 bool server::verify_seq(int seq, int lastSeq) {
-  cout << "seq: " << seq << " lastSeq: " << dec << lastSeq << "\n";
   if ( seq == 0 )
   {
     if ( lastSeq != 15 ) { return false; }
@@ -258,87 +149,223 @@ bool server::verify_seq(int seq, int lastSeq) {
   if (seq != lastSeq + 1) { return false; }
   return true;
 }
+//// Recebe uma mensagem em forma de texto
+//void server::receive_text(frame *f) {
+//  string textoReceive;
+//  textoReceive.append(f->get_dado());
+//  int lastSeq = f->get_seq();
+//
+//  do {
+//    if (!receive_valid_frame(&f)) { return; }
+//    if (f->get_tipo() != TEXTO) { continue; }
+//    if (f->get_seq() == lastSeq) { continue; }
+//
+//    lastSeq = f->get_seq();
+//    textoReceive.append(f->get_dado());
+//  } while (f->get_tipo() != FIMT);
+//
+//  cout << "Mensagem recebida: " << textoReceive << "\n";
+//}
+//
+//// Verifica o espaco disponivel em disco
+//unsigned long server::chk_available_size() {
+//  struct statvfs st;
+//  if (statvfs(FILE_DESTINATION, &st) == -1) {
+//    cout << "Erro no statvfs, abortado\n";
+//    // send_error();
+//    return -1;
+//  }
+//
+//  return st.f_bsize * st.f_bavail;
+//}
+//
+//// Recebe o frame com o tamanho do arquivo
+//int server::receive_file_size(frame *f) {
+//
+//  /*
+//     > verifica a sequencia do frame e o tipo
+//     > se o frame nao for a sequencia esperada, envia um ack(0) e espera receber
+//     a sequencia esperada > se o frame for o esperado, verifica o crc8 > se o
+//     crc estiver certo, envia um ack e continua > se estiver errado, envia um
+//     nack e espera receber o proximo frame
+//  */
+//  cout << "Recebendo tamanho do frame\n";
+//  do {
+//    if ( f->get_tipo() != MIDIA ) { continue; }
+//    if ( f->get_seq() == 0 && verify_crc8(f) ) { break; }
+//    
+//    if ( f->get_seq() != 0 )
+//      cout << "Sequencia errada\n";
+//    else
+//      cout << "Crc errado\n";
+//
+//    cout << "Aguardando frame\n";
+//
+//    f = receive_frame_socket();
+//    if (!f) { return 0; }
+//
+//    cout << "Frame recebido\n";
+//
+//  } while (true);
+//
+//  unsigned long availSize = chk_available_size();
+//  if (availSize == -1) { return -1; }
+//
+//  cout << "Frame file size:" << f->get_dado() << "\n";
+//  int fileSize = stoi(f->get_dado());
+//
+//  if (fileSize > availSize * 0.9) {
+//    cout << "Tamanho do arquivo muito grande, abortado\n";
+//    // send_error();
+//    return 0;
+//  }
+//
+//  cout << "Espaco suficiente em disco\n";
+//  return 1;
+//}
+//
+//bool server::create_received_dir() {
+//
+//  // check if the directory exists
+//  struct stat info;
+//  if (stat(FILE_DESTINATION, &info) == 0 && (info.st_mode & S_IFDIR)) {
+//    cout << "Diretorio ja existe\n";
+//    return true;
+//  }
+//
+//  // create the directory
+//  if (mkdir(FILE_DESTINATION, 0700) == -1) {
+//    cout << "Erro ao criar o diretorio\n";
+//    return false;
+//  }
+//
+//  cout << "Diretorio criado com sucesso\n";
+//  return true;
+//}
+//
+//string server::receive_file_name() {
+//  frame *fReceive;
+//
+//  // Aguarda receber um frame do tipo midia com o nome do arquivo
+//  // E com a sequencia de numero 2
+//  /*
+//    > recebe o frame e verifica se o tipo e a sequencia estao corretos
+//    > se estiverem, verifica o crc8
+//    > se estiver correto, envia um ack e continua
+//    > se estiver errado, envia um nack e espera receber o proximo frame
+//  */
+//  cout << "Recebendo nome do arquivo\n";
+//
+//  do {
+//    cout << "Aguardando frame\n";
+//    fReceive = receive_frame_socket();
+//    if (!fReceive) { return string{}; }
+//
+//    cout << "Frame recebido\n";
+//
+//    if (fReceive->get_tipo() != MIDIA) { continue; }
+//    if ( fReceive->get_seq() != 1 )    
+//    { 
+//      cout << "Sequencia errada\n";
+//      fReceive->set_seq(0);
+//      send_ack(fReceive);
+//      continue;
+//    }
+//
+//    if (verify_crc8(fReceive)) { break; }
+//
+//    cout << "Crc invalido, aguardando retransmissao\n";
+//
+//  } while (true);
+//
+//  cout << "Nome do arquivo recebido com sucesso\n";
+//  cout << "Nome do arquivo: " << fReceive->get_dado() << "\n";
+//
+//  return string(fReceive->get_dado());
+//}
 
-int server::receive_file_data(string fileName) {
-  string fileDestination;
-  fileDestination.append(FILE_DESTINATION);
-  fileDestination.push_back('/');
-  fileDestination.append(fileName);
-
-  // Abre o arquivo para escrita
-  ofstream file;
-  file.open(fileDestination, ios::binary);
-  if (!file.is_open()) {
-    cout << "Falha ao criar o arquivo. Abortado\n";
-    return 0;
-  }
-
-  cout << "Arquivo criado com sucesso\n";
-
-  int lastSeq = 1;
-  frame *f;
-
-  cout << "\tRecebendo dados arquivo\n";
-  do {
-    cout << "Aguardando frame\n";
-
-    // Fica tentando receber um frame
-    f = receive_frame_socket();
-    if (f == NULL) { return 0; }
-
-    cout << "Frame recebido\n";
-    f->imprime(HEX);
-
-    if (f->get_tipo() == FIMT) { break; }
-
-    if (f->get_tipo() != DADOS) { continue; }
-
-    if (f->get_seq() == lastSeq) { continue; }
-
-    // Recebeu um frame com uma sequencia errada
-    if (!verify_seq(f->get_seq(), lastSeq)) {
-      cout << "Frame com a sequencia errada; Pedindo a certa\n";
-      f->set_seq(lastSeq);
-      send_ack(f);
-      continue;
-    }
-
-    if (!verify_crc8(f)) { 
-      cout << "Crc invalido\n";
-      continue; 
-    }
-
-    cout << "Seq " << int(f->get_seq()) << "recebida com sucesso\n";
-    lastSeq = f->get_seq();
-    file.write(f->get_dado(), f->get_tam());
-
-  } while (true);
-
-  cout << "Dados do arquivo recebido com sucesso\n";
-  send_ack(f);
-
-  file.close();
-  return 1;
-}
-
-void server::receive_midia(frame *f) {
-  cout << "Recebendo frame midia\n";
-  if (!create_received_dir()) { return; }
-  if (!receive_file_size(f)) { return; }
-
-  string fileName = receive_file_name();
-
-  if (fileName.size() == 0) { return; }
-
-  if ( !receive_file_data(fileName) ) {
-    cout << "Falha ao receber o arquivo\n";
-    return;
-  }
-
-  cout << "Arquivo recebido com sucesso\n";
-}
 
-// Recebe um frame do cliente
+//
+//int server::receive_file_data(string fileName) {
+//  string fileDestination;
+//  fileDestination.append(FILE_DESTINATION);
+//  fileDestination.push_back('/');
+//  fileDestination.append(fileName);
+//
+//  // Abre o arquivo para escrita
+//  ofstream file;
+//  file.open(fileDestination, ios::binary);
+//  if (!file.is_open()) {
+//    cout << "Falha ao criar o arquivo. Abortado\n";
+//    return 0;
+//  }
+//
+//  cout << "Arquivo criado com sucesso\n";
+//
+//  int lastSeq = 1;
+//  frame *f;
+//
+//  cout << "\tRecebendo dados arquivo\n";
+//  do {
+//    cout << "Aguardando frame\n";
+//
+//    // Fica tentando receber um frame
+//    f = receive_frame_socket();
+//    if (f == NULL) { return 0; }
+//
+//    cout << "Frame recebido\n";
+//    f->imprime(HEX);
+//
+//    if (f->get_tipo() == FIMT) { break; }
+//
+//    if (f->get_tipo() != DADOS) { continue; }
+//
+//    if (f->get_seq() == lastSeq) { continue; }
+//
+//    // Recebeu um frame com uma sequencia errada
+//    if (!verify_seq(f->get_seq(), lastSeq)) {
+//      cout << "Frame com a sequencia errada; Pedindo a certa\n";
+//      f->set_seq(lastSeq);
+//      send_ack(f);
+//      continue;
+//    }
+//
+//    if (!verify_crc8(f)) { 
+//      cout << "Crc invalido\n";
+//      continue; 
+//    }
+//
+//    cout << "Seq " << int(f->get_seq()) << "recebida com sucesso\n";
+//    lastSeq = f->get_seq();
+//    file.write(f->get_dado(), f->get_tam());
+//
+//  } while (true);
+//
+//  cout << "Dados do arquivo recebido com sucesso\n";
+//  send_ack(f);
+//
+//  file.close();
+//  return 1;
+//}
+//
+//void server::receive_midia(frame *f) {
+//  cout << "Recebendo frame midia\n";
+//  if (!create_received_dir()) { return; }
+//  if (!receive_file_size(f)) { return; }
+//
+//  string fileName = receive_file_name();
+//
+//  if (fileName.size() == 0) { return; }
+//
+//  if ( !receive_file_data(fileName) ) {
+//    cout << "Falha ao receber o arquivo\n";
+//    return;
+//  }
+//
+//  cout << "Arquivo recebido com sucesso\n";
+//}
+//
+//// Recebe um frame do cliente
 frame *server::receive_frame_socket() {
   frame *fReceive;
   int retries = 0;
@@ -355,28 +382,28 @@ frame *server::receive_frame_socket() {
 
   return fReceive;
 }
-
-bool server::verify_crc8(frame *f) {
-  int crc8 = f->chk_crc8();
-  if (!crc8) {
-    send_nack(f);
-  }
-  else
-    send_ack(f);
-  return crc8;
-}
-
-int server::receive_valid_frame(frame **f) {
-
-  do {
-    // Se nao conseguir receber o frame, mata a comunicacao
-    *f = receive_frame_socket();
-    if (*f == NULL) { return 0; }
-
-    // Avisa o cliente se nao conseguiu receber o frame
-  } while (!verify_crc8(*f));
-  return 1;
-}
+//
+//bool server::verify_crc8(frame *f) {
+//  int crc8 = f->chk_crc8();
+//  if (!crc8) {
+//    send_nack(f);
+//  }
+//  else
+//    send_ack(f);
+//  return crc8;
+//}
+//
+//int server::receive_valid_frame(frame **f) {
+//
+//  do {
+//    // Se nao conseguir receber o frame, mata a comunicacao
+//    *f = receive_frame_socket();
+//    if (*f == NULL) { return 0; }
+//
+//    // Avisa o cliente se nao conseguiu receber o frame
+//  } while (!verify_crc8(*f));
+//  return 1;
+//}
 
 queue<frame *> server::receive_frames_window(int lastSeq)
 {
@@ -385,8 +412,7 @@ queue<frame *> server::receive_frames_window(int lastSeq)
   int retries = 0;
 
   do {
-    f = receive_frame_socket();
-    if ( f == NULL ) { continue; }
+    if ( ! (f = receive_frame_socket()) ) { continue; }
     
     retries++;
 
@@ -448,61 +474,90 @@ queue<frame *> server::receive_frames_window(int lastSeq)
 
   } while ( (f == NULL && retries < NUM_RETRIES) || frames_queue.size() < TAM_JANELA );
 
+  if ( f == NULL && retries == NUM_RETRIES ) { return queue<frame *>(); }
+
   return frames_queue;
 }
 
 void server::start_receveing_message() {
   int continueTransmission = 1;
+  int lastSeq = -1;
+  int tipo_data = -1;
+  vector<char> data;
+  queue<frame *> client_answer;
 
   cout << "Recebendo frames\n";
-  int lastSeq = -1;
+  // Fic aouvindo o cliente ate receber um FIMT
   do {
     queue<frame *> frames = receive_frames_window(lastSeq);
-    cout << "Quantidade de frames: " << frames.size() << "\n";
+    if ( frames.empty() ) { return; }
+
+    cout << "Quantidade de frames na janela: " << frames.size() << "\n";
 
+    // Ve o que faz com cada frame de acordo com o tipo
     while ( !frames.empty() )
     {
-      cout << "Frame recebido: \n";
       frame *f = frames.front();
       frames.pop();
+
+      // Recebeu um frame com erro, retorna um nack e sai da funcao
+      if ( !f->chk_crc8() ) {
+        client_answer.push(create_ack_nack(NACK, f->get_seq()));
+        continue;
+      }
+
+      else { 
+        client_answer.push(create_ack_nack(ACK, f->get_seq()));
+      }
+      
+      cout << "Frame recebido: \n";
       f->imprime(HEX);
       cout << "\n";
 
       int tipo = f->get_tipo();
+      int tam = f->get_tam();
+      char *data_f = f->get_dado();
       switch (tipo)
       {
         case FIMT:
+          cout << "Encerrou a transmissao\n";
           continueTransmission = 0;
 
         case TEXTO:
+          data.insert(data.end(), data_f, data_f + tam);
           lastSeq = f->get_seq();
+          tipo_data = TEXTO;
       }
     }
 
     cout << "Recebeu todos os frames de uma janela\n";
 
-//    if (!receive_valid_frame(&f)) { return; }
-//    if (!f) { return; }
-//    int frameType = f->get_tipo();
-//
-//    switch (frameType) {
-//    case TEXTO:
-//      receive_text(f);
-//      continueTransmission = 0;
-//      break;
-//
-//    case MIDIA:
-//      receive_midia(f);
-//      continueTransmission = 0;
-//      break;
-//
-//    default:
-//      break;
-//    }
-//
+    // Envia a reposta ao cliente
+    cout << "Enviando acks e nacks para o cliente\n";
+    while ( !client_answer.empty() )
+    {
+      frame *f_answer = client_answer.front();
+      client_answer.pop();
+
+      if (socket->send_frame(f_answer) == -1 )
+      {
+        cout << "Falha ao enviar a resposta\n";
+        return;
+      }
+
+      if (f_answer->get_tipo() == NACK)
+        cout << "NACK " << (int)f_answer->get_dado()[0] << " enviado\n";
+
+      else
+        cout << "ACK " << (int)f_answer->get_dado()[0] << " enviado\n";
+    }
+
+    cout << "Todos os ACKs e NACKs foram enviados\n";
+
   } while (continueTransmission);
 
-  cout << "Encerrou a transmissao\n";
+  if ( tipo_data == TEXTO ) 
+    cout << ">>>>>>>>>>>>>> Mensagem recebida: " << string(data.begin(), data.end()) << "\n";
 }
 
 // ------------------------------- PUBLIC --------------------------------- //
@@ -528,7 +583,7 @@ void server::run() {
       continue;
     }
 
-    send_ack(fReceive);
+    if ( send_ack(fReceive) == -1 ) { continue; }
     start_receveing_message();
   }
 }
diff --git a/todo.txt b/todo.txt
index bb047c2..ac91a4b 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,15 +1,8 @@
 -> Ver se os frames que estao vindo sao arquivos e juntar eles no arquivo
 
--> Arrumar receive valid frame, retries
-
--> Arrumar nome arquivo > 63
-
 -> Arrumar a interface
 
--> Merge correcao de erro
-  -> Enviar arquivo correcao de erros
-  -> Readme
-  -> Demonstracao
+-> Demonstracao correcao de erros
 
 -> Janela deslizante
   -> Demonstracao
-- 
GitLab